1. 程式人生 > >2018網易遊戲雷火盤古實習生筆試

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;
}