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




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值