2018網易遊戲雷火盤古實習生筆試
看了往年的題目,今年一如既往的是4個題目,講道理都是區域賽簽到題水平,或稍微難些,不及銅牌題。
雖然把機械鍵盤從公司拿回來了,但是手太生了,發揮的有點失常,估計是與網易遊戲無緣了T_T。去年秋季九一八就讓我去南京筆試,我那陣子在泡圖書館幹大事,實在沒空,錯過了一次機會,這次又沒抓住,哎。。。
1.第一個題,扔硬幣,10000個硬幣排成一排,每次選一個區間翻面,翻1000次,可以用樹狀陣列區實現間加減法,講道理如果暴力1kw複雜度人品好能過吧,沒試過。
#include <iostream> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string> #include <string.h> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <stack> using namespace std; int n,m; int coins[10009]; int ans[10009]; int main(){ while(cin>>n>>m){ memset(coins,0,sizeof(coins)); memset(ans,0,sizeof(ans)); int MAXN=0; for(int i=0;i<m;i++){ int a,b; scanf("%d%d",&a,&b); coins[a]++; coins[b+1]--; MAXN=max(b,MAXN); } ans[1]=coins[1]; for(int i=1;i<=n;i++){ coins[i]=coins[i-1]+coins[i]; if(coins[i]&1==1)printf("1"); else printf("0"); } cout<<endl; } return 0; }
2.給三角形三個點,並給出一個新點,判斷在不在三角形內,如果在內部求這個新點的插值。對插值不太熟悉,我連這玩意的定義公式都忘了,目測計算機圖形學講過?沒想到好辦法,跳過去了,沒寫,最後也沒寫這個題,光糾結最後一個題了。判斷點在三角形內,可以用該點的y座標橫著切一刀,比較一下左右交點的奇偶性就行了。
3.100個村子之間有路,求出一共有幾個聯通的集合,-1之後算出至少新修幾條路能使其全部聯通。資料量太小了,一開始想用並查集,後來覺得簡直大材小用,隨便搞搞,dfs一下暴力一下就行了。
#include <iostream> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string> #include <string.h> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <stack> using namespace std; int n,m; vector<int>G[109]; bool used[109]; void dfs(int root){ used[root]=1; for(int i=0;i<G[root].size();i++){//cout<<"size "<<G[i].size(); if(used[G[root][i]]==0){ dfs(G[root][i]); } } } int main(){ while(cin>>n>>m){ memset(used,0,sizeof(used)); for(int i=0;i<101;i++){ G[i].clear(); } for(int i=0;i<m;i++){ int a,b; cin>>a>>b; G[a].push_back(b); G[b].push_back(a); } int ans=0; for(int i=1;i<=n;i++){ if(used[i]==0){ dfs(i); ans++; } } cout<<ans-1<<endl; } return 0; }
4.最後一個題,開始寫的時候還有一個多小時,浪費的時間有點多。給出一個長度50的大寫字母組成的字串,每次能列印連續的同樣字母的字串,後打的可以覆蓋前面的,問至少列印幾次能列印完。這個題是典型的區間DP,一開始我自己出的測試樣例水了,覺得貪心就能過,然後交了一發貪心的,結果case通過率2%,不知道算不算罰時啊。這個題掛了之後我就去研究第二個題了,第二個題沒研究出來又回來研究這個題,然後慢慢敲,剩了5分鐘才研究出來公式,之前少考慮了兩邊夾中間的,然後這個題沒寫完就到點了,最後把樣例都過不了的程式碼交上去了- -。時間截止之後,我又把這題程式碼寫完了,自己出的樣例都能過了。。。哎。。。再給我半個小時就好了,自己太水了。
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <stack>
using namespace std;
char S[58];
int dp[55][55];
int main(){
while(scanf("%s",S)!=EOF){
int l=strlen(S);
for(int i=0;i<l;i++){
for(int j=0;j<l;j++){
dp[i][j]=999;
if(j==i)dp[i][j]=1;
}
}
for(int i=1;i<l;i++){//length
for(int j=0;j<l-1;j++){//qidian
int k=j+i;//zhongdian
if(k>=l)continue;
if(S[k]==S[k-1]){
dp[j][k]=min(dp[j][k],dp[j][k-1]);
}
if(S[j]==S[j+1]){
dp[j][k]=min(dp[j][k],dp[j+1][k]);
}
if(S[j]==S[k]&&l>=3){
dp[j][k]=min(dp[j][k],dp[j+1][k-1]+1);
}
dp[j][k]=min(dp[j][k],dp[j][k-1]+1);
dp[j][k]=min(dp[j][k],dp[j+1][k]+1);
for(k=j+1;k<=j+i&&k<l;k++){
dp[j][j+i]=min(dp[j][j+i],dp[j][k-1]+dp[k][j+i]);
}
}
}
cout<<dp[0][l-1]<<endl;
}
return 0;
}