【编程题解】2021春招第2次牛客模考笔试题技术方向

消消看

知识点:贪心,排序
题意:给定一个01串,每次可以选择一个连续的0或者1子串消除。两个人轮流消除,求双方都最优选择时,胜者是谁以及分数之差。
思路:显然不可能选择'0'子串。并且有多个'1'子串时会选择最长的那个1串。因此用贪心策略即可,预处理出所有'1'子串的长度,然后从大到小选择即可。
复杂度

#include<bits/stdc++.h>
using namespace std;
int main(){

    int t;
    cin>>t;
    while(t--){
        vector<int>v;
        int n,i,cnt=0;
        string s;
        cin>>s;
        for(i=0;i<s.length();i++){
            if(s[i]=='1')cnt++;
            else v.push_back(cnt),cnt=0;
        }
        v.push_back(cnt);
        sort(v.begin(),v.end());
        int c1=0,c2=0;
        for(i=0;i<v.size();i++){
            if(i%2)c2+=v[i];
            else c1+=v[i];
        }
        if(c1<c2)cout<<"Niumei\n"<<c2-c1<<endl;
        else if(c1==c2)cout<<"Draw\n";
        else cout<<"Niumei\n"<<c1-c2<<endl;
    }
}

赏金猎人

知识点:贪心,排序,优先队列
题意:每个人有一个战斗力和金钱。每个人只能击杀比自己战斗力低的人,并获得他的金钱。问在最多击杀 个人的前提下,每个人最多的钱是多少?
思路:对于每个人而言,只需要在战斗力比他小的人里,找出 个最大的金钱即可。观察到 的范围不超过10,因此可以用优先队列(最大堆)解决这个问题。
写代码的时候要注意细节,处理“战斗力相等”的人的时候要格外小心。
复杂度

using namespace std;
struct people{
    int attack,money,id,res;
};

people a[100010];
bool cmp(people a,people b){
    return a.attack<b.attack;
}
bool cmp_by_id(people a,people b){
    return a.id<b.id;
}
priority_queue<int>q;
int main(){
    int n,k,i,j;
    cin>>n>>k;
    for(i=0;i<n;i++)cin>>a[i].attack;
    for(i=0;i<n;i++){
        cin>>a[i].money;
        a[i].id=i;
        a[i].res=a[i].money;
    }
    sort(a,a+n,cmp);
    vector<int>temp;
    for(i=0;i<n;i++){
        vector<int>to_be_killed;
        int now=q.size();
        for(j=0;j<min(k,now);j++){
            a[i].res+=q.top();
            to_be_killed.push_back(q.top());
            q.pop();
        }
        for(j=0;j<to_be_killed.size();j++){
            q.push(to_be_killed[j]);
        }
        temp.push_back(a[i].money);
        to_be_killed.clear();
        if(i<n-1&&a[i].attack<a[i+1].attack){
            for(j=0;j<temp.size();j++){
                q.push(temp[j]);
            }
            temp.clear();
        }
    }
    sort(a,a+n,cmp_by_id);
    for(i=0;i<n;i++){
        cout<<a[i].res<<" ";
    }

}

身份证

解法一

知识点:排序、二分
思路:可以发现每个数都在 的数据范围内。对于一个十八位数 而言, 和它前 个数字相等意味着除了前 个数字以外, 的后 个数字一定在 000..00到 999..99范围内。
例如,对于数字123451234512345123,如果另一个数和它有长度为5的公共前缀,那么这个数的取值范围是 123450000000000000到123459999999999999。
所以这道题可以用二分来解,对于每个数,二分去找其前缀长度为 的合法上界和下界,若该上界和下界中包含的数不为零,那么意味着存在该公共前缀的数。
复杂度

解法二

知识点:字典树
思路:如果熟悉字典树的话可以发现这是一道字典树的裸题。建一棵字典树,每个节点上存该前缀的字符串数量。然后就可以做到每次 进行查询了。
复杂度
参考代码(二分解法):

#include<bits/stdc++.h>
using namespace std;
#define ll long long
vector<long long>v;
ll pow10[20];
int main(){
    int n,q,i;
    pow10[0]=1;
    for(i=1;i<18;i++)pow10[i]=pow10[i-1]*10;
    cin>>n>>q;
    for(i=0;i<n;i++){
        ll x;
        cin>>x;
        v.push_back(x);
    }
    sort(v.begin(),v.end());
    while(q--){
        ll x;
        cin>>x;
        ll j=17;
        ll out1=0,out2=0;
        for(i=1;i<=18;i++,j--){
            ll l=x/pow10[j]*pow10[j],r=(x/pow10[j]+1)*pow10[j];
            ll c1=lower_bound(v.begin(),v.end(),l)-v.begin();
            ll c2=upper_bound(v.begin(),v.end(),r)-v.begin();
            if(c1==c2)break;
            out1=i,out2=c2-c1;
        }
        if(out1==0)out2=n;
        cout<<out1<<" "<<out2<<endl;
    }
}
全部评论
学习委员厉害👍
点赞
送花
回复
分享
发布于 2021-04-16 18:56
点赞
送花
回复
分享
发布于 2021-04-16 19:02
网易互娱
校招火热招聘中
官网直投
没有Java题解吗
点赞
送花
回复
分享
发布于 2021-04-16 23:27

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
1 3 评论
分享
牛客网
牛客企业服务