网易算法岗4.21题解

A 删除平均数

题目大意大概是每次删掉比平均数大的,问删几次之后变成只有一个数。

先排序之后预处理前缀和,然后从后往前扫一下就行了,白给题。

#include<bits/stdc++.h>
using namespace std;
long long sum[101010],a[101010],s=0;
int main(){
    int n,i;
    cin>>n;
    for(i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+n+1);
    for(i=1;i<=n;i++)sum[i]=s+=a[i];
    long long temp=sum[n],res=0,cnt=n;
    for(i=n;i>0;i--){
        if(a[i]==a[1])break;
        if(a[i]*cnt<=temp)res++,temp=sum[i],cnt=i;
    }
    cout<<res;
}

B 最长递增祖先

本题要求每个节点往上的最远递增的祖先,这题确实可以建图然后dfs,不过那样写比较麻烦,直接用并查集+路径压缩就行了。

#include<bits/stdc++.h>
using namespace std;
int fa[101010];
int f(int x){return fa[x]==x?x:fa[x]=f(fa[x]);}
int a[101010],b[101010];
int main(){
    int n,i;
    cin>>n;
    for(i=1;i<=n;i++)fa[i]=i,cin>>a[i];
    for(i=2;i<=n;i++){
        cin>>b[i];
        if(a[b[i]]<a[i])fa[f(i)]=f(b[i]);
    }
    for(i=1;i<=n;i++)cout<<f(i)<<' ';
}

C 质数变换

题目大意是对于每个数可以变成大于它的最小质数或者小于它的最大质数,问最少多少次操作后所有数相等。

这道题考察了中位数定理,先排序然后最终变成的质数一定的离中位数最近的那个。如果有两个中位数,最终的质数就是取两个中位数最中间的那个质数。

要注意特判最开始所有数相等的情况,我因为没特判这个一直卡在90%过不去,结束之后自测了一个用例才发现。。

#include<bits/stdc++.h>
using namespace std;
int pr[101010],ok[101010],a[101010];
int main(){
    int n,i,j;
    ok[1]=1;
    for(i=2;i<=1e5+100;i++){
        if(ok[i])continue;
        for(j=i*2;j<=1e5+100;j+=i)ok[j]=1;
    }
    j=0;
    for(i=2;i<=1e5;i++)if(!ok[i])pr[j++]=i;
    cin>>n;
    for(i=0;i<n;i++)cin>>a[i];
    sort(a,a+n);
    if(a[0]==a[n-1])return cout<<0,0;
    long long res=0;
    int pid;
    if(n&1){
        int m=n/2;
        pid=lower_bound(pr,pr+j,a[m])-pr;
    }
    else{
        int m1=n/2-1,m2=m1+1;
        int pid1=lower_bound(pr,pr+j,a[m1])-pr;
        int pid2=upper_bound(pr,pr+j,a[m2])-pr-1;
        pid=pid1+pid2>>1;
    }
    for(i=0;i<n;i++){
        if(a[i]<pr[pid]){
            if(ok[a[i]])res++;
            int nowid=lower_bound(pr,pr+j,a[i])-pr;
            res+=pid-nowid;
        }
        else{
            int nowid=lower_bound(pr,pr+j,a[i])-pr;
               res+=nowid-pid;
        }
    }
    cout<<res;
}

D 小红的循环节长度

题目大意是给定一个分数,求循环节前面的长度和循环节的长度。

这个题需要一定的数学知识和数论能力。首先有个结论,循环节前面的长度取决于2和5因子数量的最大值。循环节长度取决于分母能被多少个连续9整数。例如7能被999999整除,所以分母7的循环节长度是6。然后根据欧拉定理,如果10和x互素,那么有 ,所以当x不含2和5的因子,只需要求出 即可(是欧拉函数,代表不超过x的且和x互素的数的个数)。

这样求出来的循环节长度不一定是最小,所以还需要枚举一下的因子,用快速幂验证一下是否能整除。

笔试的时候没开int128,结果爆longlong了,一直70%通过率,气死了。。。今天上午复盘的时候发现如果分母超1e9的话,快速幂的时候会爆longlong,只能用int128或者高精度之类的解决了,估计有两个测试用例是爆了longlong

#include<bits/stdc++.h>
using namespace std;
long long phi(long long x){
    long long i;
    long long res=x;
    for(i=2;i*i<=x;i++){
        if(x%i==0){
            res=res/i*(i-1);
            while(x%i==0)x/=i;
        }
    }
    if(x>1)res=res/x*(x-1);
    return res;
}
long long power(__int128 a,long long b,long long p){
    __int128 res=1;
    while(b){
        if(b&1)res=res*a%p;
        b>>=1;
        a=a*a%p;
    }
    return res;
}
int main(){
    long long p,q,i,c2=0,c5=0;
    cin>>p>>q;
    q/=__gcd(p,q);
    while(q%2==0)q/=2,c2++;
    while(q%5==0)q/=5,c5++;
    if(q==1)return cout<<-1,0;
    long long temp=phi(q);
    long long mi=1e16;
    for(i=1;i*i<=temp;i++){
        if(temp%i==0){
            if(power(10,i,q)==1)mi=min(mi,i);
            if(power(10,temp/i,q)==1)mi=min(mi,temp/i);  
        }
    }
    cout<<max(c2,c5)<<' '<<mi;
}
#网易笔试##笔试题目##笔经##网易#
全部评论

相关推荐

工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
评论
9
10
分享
牛客网
牛客企业服务