牛客练习赛148 复盘(A-C)

比赛链接

A 签到题

https://ac.nowcoder.com/acm/contest/127263/A
思路:因为相邻数字的gcd都为1 所以直接顺序输出即可=

B dfs

Bob的蛋糕店
思路:n的范围1-20 dfs即可

点击查看代码
void solution::solve()
{
    int n,k;cin>>n>>k;
    vector<int> a(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    vector<int> vis(n+1,0);
    int f=0;
    double sum11=0,sum0=0;
    for(int i=1;i<=n;i++) sum11+=i*a[i],sum0+=a[i];
    function<void(int,int,int,int)> dfs=[&](double sum1,double sum,int cnt,int p)
    {   
        if(cnt>=k)
        {
            if(sum1/sum==sum11/sum0) f=1;
            return;
        }
        else if(f) return;
        for(int i=p;i<=n;i++)
        {
            if(vis[i]) continue;
            double s1=sum1-a[i]*i,s0=sum-a[i];
            vis[i]=1;
            dfs(s1,s0,cnt+1,i);
            vis[i]=0;
        } 
    };
    dfs(sum11,sum0,0,1);
    if(f) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;

C 应该算模拟?

修复排列
思路:由于答案是往后继承的 所以每次遇到新的数字被挖空了 就先判断之前有没有修改过
如果有则不变 如果没有 则通过类似一条链去寻找 在代码中注释了

点击查看代码
void solution::solve()
{
    int n;cin>>n;
    vector<int> a(n+1),b(n+1),c(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    for(int i=1;i<=n;i++) cin>>c[i];
    map<int,int> mp;
    for(int i=1;i<=n;i++) mp[a[i]]=i;
    //记录了a[i]这个值对应的下标

    set<int> st;
    for(int i=1;i<=n;i++)
    {
        int x=b[i];
        //只要x没有被找到 说明数组此时没有修复完全
        while(st.find(x)==st.end()) 
        {
            st.insert(x);
            //放入之后再判断a[i]对应的c[i]是否存在
            //如果c[i]不存在 
            //说明a[newi]和对应的c[newi]需要被修改
            //newi为c[i]==a[newi]时的取值
            x=c[mp[x]];       
        }
        cout<<st.size()<<" \n"[i==n];
    }
}

总结

在b题花了太多时间 康复训练还要继续orz 总的来说就是码力差了

posted @ 2026-01-24 21:33  无限ovo  阅读(2)  评论(0)    收藏  举报