首页 > 其他分享 >牛客小白月赛99

牛客小白月赛99

时间:2024-08-24 09:15:24浏览次数:15  
标签:vis int ll 小白月赛 pos 99 牛客 ans

牛客小白月赛99

\(A\) 牛客 NC275617 材料打印 \(AC\)

  • \(by+a \times \min(x,y)\) 即为所求。

    点击查看代码
    int main()
    {
        ll t,a,b,x,y,i;
        cin>>t;
        for(i=1;i<=t;i++)
        {
            cin>>a>>b>>x>>y;
            cout<<b*y+a*min(x,y)<<endl;
        }
        return 0;
    }
    

\(B\) 牛客 NC275619 %%% \(AC\)

  • 观察样例发现和 \(\log_{2}\) 相关,自然而然地想到每次减少一半左右。

  • 容易发现每次取 \(mod=\left\lfloor \frac{n}{2} \right\rfloor+1\) ,从而使 \(n\) 变成 \(\left\lfloor \frac{n}{2} \right\rfloor-1\) 是最优情况。

    • 取 \(mod=\left\lfloor \frac{n}{2} \right\rfloor-1\) 不如 \(mod=\left\lfloor \frac{n}{2} \right\rfloor+1\) 优。
    点击查看代码
    int main()
    {
        ll t,n,ans,i;
        cin>>t;
        for(i=1;i<=t;i++)
        {
            cin>>n;
            ans=0;
            while(n!=0)
            {
                n%=(n/2+1);
                ans++;
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    

\(C\) 牛客 NC275634 迷宫 \(AC\)

  • \(DFS\) 处理出起点、终点所在的连通块,分别记作 \(S,E\) 。若 \(E\) 中存在一个点或与其相邻的点可以被 \(S\) 中点使用一次超能力到达则合法。

    点击查看代码
    int hang[1010],lie[1010],vis[1010][1010],dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1},n,m;
    char s[1010][1010];
    void dfs1(int x,int y)
    {
        vis[x][y]=1;
        hang[x]=1;
        lie[y]=1;
        for(int i=1;i<=4;i++)
        {
            int nx=x+dx[i],ny=y+dy[i];
            if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&vis[nx][ny]==0&&s[nx][ny]!='#')
            {
                dfs1(nx,ny);
            }
        }
    }
    void dfs2(int x,int y)
    {
        vis[x][y]=1;
        if(hang[x]==1||hang[x-1]==1||hang[x+1]==1||lie[y]==1||lie[y-1]==1||lie[y+1]==1)
        {
            cerr<<x<<" "<<y<<endl;
            cout<<"YES"<<endl;
            exit(0);
        }
        for(int i=1;i<=4;i++)
        {
            int nx=x+dx[i],ny=y+dy[i];
            if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&vis[nx][ny]==0&&s[nx][ny]!='#')
            {
                dfs2(nx,ny);
            }
        }
    }
    int main()
    {
        int sx,sy,ex,ey,i,j;
        cin>>n>>m;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                cin>>s[i][j];
                if(s[i][j]=='S')
                {
                    sx=i;
                    sy=j;
                }
                if(s[i][j]=='E')
                {
                    ex=i;
                    ey=j;
                }
            }
        }
        dfs1(sx,sy);
        memset(vis,0,sizeof(vis));
        dfs2(ex,ey);
        cout<<"NO"<<endl;
        return 0;
    }
    

\(D\) 牛客 NC275683 又是一年毕业季 \(AC\)

  • 在前 \(n+1\) 个质数里找到一个最小的不在 \(\{ a \}\) 中出现过的质数即可。

    点击查看代码
    int prime[300010],vis[3000010],f[3000010],len=0;
    void isprime(int n)
    {
        memset(vis,0,sizeof(vis));
        for(int i=2;i<=n;i++)
        {
            if(vis[i]==0)
            {
                len++;
                prime[len]=i;	
            }
            for(int j=1;j<=len&&i*prime[j]<=n;j++)
            {
                vis[i*prime[j]]=1;
                if(i%prime[j]==0)
                {
                    break;
                }
            }
        }
    }
    int main()
    {
        int t,n,a,i,j;
        cin>>t;
        isprime(3000000);
        for(j=1;j<=t;j++)
        {
            memset(f,0,sizeof(f));
            cin>>n;
            for(i=1;i<=n;i++)
            {
                cin>>a;
                if(a<=3000000&&vis[a]==0)
                {
                    f[a]=1;
                }
            }
            for(i=1;i<=n+1;i++)
            {
                if(f[prime[i]]==0)
                {
                    cout<<prime[i]<<endl;
                    break;
                }
            }
        }
        return 0;
    }
    

\(E\) 牛客 NC275713 多米诺骨牌 \(AC\)

  • CF56E Domino Principle ,处理出向右的最远延伸距离。

  • 删掉被包含的小区间,然后取 \(m\) 个长度较大的彼此不相交区间即可。

    点击查看代码
    struct node
    {
        int x,r,L,R;
    }a[200010];
    int len[200010];
    bool cmp(node a,node b)
    {
        return a.x<b.x;
    }
    int main()
    {
        int t,n,m,nn,pos,ans=0,i,j;
        cin>>t;
        for(j=1;j<=t;j++)
        {
            cin>>n>>m;
            ans=nn=pos=0;
            for(i=1;i<=n;i++)
            {
                cin>>a[i].r;
            }
            for(i=1;i<=n;i++)
            {
                cin>>a[i].x;
            }
            sort(a+1,a+1+n,cmp);
            for(i=1;i<=n;i++)
            {
                a[i].L=a[i].R=i;
            }
            for(i=n;i>=1;i--)
            {
                while(a[i].R+1<=n&&a[i].x+a[i].r>=a[a[i].R+1].x)
                {
                    a[i].r=max(a[i].r,a[a[i].R+1].x+a[a[i].R+1].r-a[i].x);
                    a[i].R=a[a[i].R+1].R;
                }
            }
            for(i=n;i>=1;i--)
            {
                while(a[i].R+1<=n&&a[i].x+a[i].r>=a[a[i].R+1].x)
                {
                    a[i].R=max(a[i].R,a[a[i].R+1].R);
                }
            }
            for(i=1;i<=n;i++)
            {
                if(a[pos].R>=a[i].R)
                {
                    continue;
                }
                else
                {
                    nn++;
                    pos=i;
                    len[nn]=a[i].R-a[i].L+1;
                }
                
            }
            sort(len+1,len+1+nn,greater<int>());
            for(i=1;i<=min(nn,m);i++)
            {
                ans+=len[i];
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    

\(F\) 牛客 NC275719 自爆机器人

  • 考虑在 \(i,j\) 两栋墙壁中移动的本质是消耗 \(2|x_{i}-x_{j}|\) 的时间。

  • 除去 \(n\) 的必须消耗时间外,以 \(m-1\) 段墙壁间的区间作为物品跑完全背包即可。

  • \(m-1\) 段的区间长度中至多有 \(\sqrt{n}\) 个本质不同的长度,去重后时间复杂度为单次查询时间复杂度为 \(O(t\sqrt{n})\) 。

    点击查看代码
    int x[200010],a[200010],f[200010];
    int main()
    {
        int T,n,m,t,ans,i,j,k;
        cin>>T;
        for(k=1;k<=T;k++)
        {
            cin>>n>>m>>t;
            ans=0;
            memset(f,0,sizeof(f));
            for(i=1;i<=m;i++)
            {
                cin>>x[i];
            }
            sort(x+1,x+1+m);
            for(i=1;i<=m-1;i++)
            {
                a[i]=2*(x[i+1]-x[i]);
            }
            sort(a+1,a+m);
            a[0]=unique(a+1,a+m)-(a+1);
            f[0]=1;
            for(i=1;i<=a[0];i++)
            {
                for(j=a[i];j<=t-n;j++)
                {
                    f[j]|=f[j-a[i]];
                }
            }
            for(i=t-n;i>=0;i--)
            {
                if(f[i]==1)
                {
                    ans=i+n;
                    break;
                }
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    

\(G\) 牛客 NC275735 大鱼吃小鱼

  • 考虑进行差分,接着进行前缀和即可计算某一时刻鱼的重量的总和。

  • 考虑将重量进行离散化,树状数组维护原重量方便差分的询问。

  • 吃掉不超过自身当前重量的鱼本质上是一个近似斐波那契求和的过程,迭代上界大约在 \(43\) 次左右,时刻离散化后暴力进行迭代即可。

    点击查看代码
    struct node
    {
        ll pos,val,tim;
    }q[200010];
    ll b[100010],l[100010],r[100010],y[100010],cnt=0;
    void add(ll pos,ll val,ll tim)
    {
        cnt++;
        q[cnt].pos=pos;
        q[cnt].val=val;
        q[cnt].tim=tim;
    }
    bool cmp(node a,node b)
    {
        return a.tim<b.tim;
    }
    struct BIT
    {
        ll c[200010];
        ll lowbit(ll x)
        {
            return (x&(-x));
        }
        void add(ll n,ll x,ll val)
        {
            for(ll i=x;i<=n;i+=lowbit(i))
            {
                c[i]+=val;
            }
        }
        ll getsum(ll x)
        {
            ll ans=0;
            for(ll i=x;i>=1;i-=lowbit(i))
            {
                ans+=c[i];
            }
            return ans;
        }
    }T;
    int main()
    {
        ll t,n,x,pos,ans,sum,num,last,i,j,k,h;
        cin>>t;
        for(h=1;h<=t;h++)
        {
            cin>>n>>x;
            cnt=0;
            for(i=1;i<=n;i++)
            {
                cin>>l[i]>>r[i]>>y[i];
                b[i]=y[i];
            }
            sort(b+1,b+1+n);
            b[0]=unique(b+1,b+1+n)-(b+1);
            for(i=1;i<=n;i++)
            {
                pos=lower_bound(b+1,b+1+b[0],y[i])-b;
                add(pos,y[i],l[i]);
                add(pos,-y[i],r[i]);
            }
            sort(q+1,q+1+cnt,cmp);
            ans=x;
            for(i=1;i<=cnt;i=j+1)
            {
                j=i;
                while(q[j+1].tim==q[j].tim&&j+1<=cnt)
                {
                    j++;
                }
                for(k=i;k<=j;k++)
                {
                    T.add(b[0],q[k].pos,q[k].val);
                }
                sum=x;
                last=0;
                while(1)
                {
                    num=T.getsum(upper_bound(b+1,b+1+b[0],sum)-b-1);
                    if(num==last)
                    {
                        break;
                    }
                    else
                    {
                        sum+=num-last;
                        last=num;
                    }
                }
                ans=max(ans,sum);
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    

总结

  • \(D\) 把调和级数的时间复杂度算错了,吃了 \(1\) 发罚时;因为清空不当,吃了 \(2\) 发罚时。
  • \(F\) 赛时没切可能是因为太着急了(?)。

标签:vis,int,ll,小白月赛,pos,99,牛客,ans
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18377378

相关文章

  • C#/asp.net-智能制造业ERP系统-89973(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP
    C#(asp.net)智能制造业ERP系统摘 要随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用C#技术建设智能制造业ERP系统。本设计主要实现集人性化、高效率......
  • 每日OJ_牛客_因子个数(简单模拟)
    目录牛客_因子个数(简单模拟)解析代码牛客_因子个数(简单模拟)因子个数__牛客网解析代码        题意就是求一个数字的因子(>=2的最小不能整除数字)个数:可以从最小因子2到数字的最大因子数(数字的平方根)开始判断是否能够取余可以则循环取余直到取余不为0,因子个数+1;......
  • 代码随想录算法训练营第 51 天 |LeetCode99岛屿数量 LeetCode100.岛屿的最大面积
    代码随想录算法训练营Day51代码随想录算法训练营第51天|LeetCode99岛屿数量LeetCode100.岛屿的最大面积目录代码随想录算法训练营前言LeetCode200岛屿数量LCR105.岛屿的最大面积一、广度优先搜索基础1、用队列实现2、代码框架:二、卡码网99岛屿数量(LeetCode......
  • 2024牛客多校第九场 C.Change Matrix 欧拉反演
    这题是欧拉反演的应用,之前没学过欧拉函数和欧拉反演,傻傻对着\(gcd(i,j)\)不知道怎么化简。首先对原来的矩阵进行转化,拆成\(n\)个小矩阵因为\(gcd(i,j)=\sum_{x|i,x|j}\phi(x)\)这是因为对于任意的正整数\(n\)都有\(n=\sum_{d|n}\phi(d)\),证明见oiwiki:https://oi-wi......
  • 线性DP P1020 [NOIP1999 提高组] 导弹拦截
    前置:二分查找,最长单调不升子序列,最长单调不降子序列(dilworth)。题解:可以用来练习手写二分,二分优化的最长上升子序列时间复杂度O(nlogn)。但是坑是非常多的。代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e5+10;inta[N],n,......
  • 2024牛客多校第10场
    10Bstd::pair(B)模拟题,没什么难度,就是有点恶心。题解提到的二叉树做法赛时也想过,但写着不太顺手就放弃了,转而写了个类似括号匹配的解法。for(inti=1;i<=n;i++){strings;cin>>c[i]>>s;mp[s]=i;}while(q--){......
  • 题解:CF991D Bishwock
    思路考虑贪心。从左往右扫,找到一个就标记一个即可。但是要注意,当遇见这种情况时000000最优的方法是左右各放一个积木,共放入两块。但如果按照刚刚的方法,则有可能会是这样0X0XX0所以在一些地方有多种放法时,应该优先放置开口朝右的积木。ACCode#include<bits/stdc++.h>......
  • 题解:CF997A Convert to Ones
    题意给定一个长度为\(n\)的01字符串,有以下两种操作:将一个子串翻转,花费\(X\)将一个子串进行取反,花费\(Y\)求把原字符串变为全是\(1\)的字符串的最小代价。思路只有\(2\)操作的情况下贪心策略。考虑到任意范围取反的花费相同,我们可以将相同的部分合并,如下图合并......
  • 题解:P9944 [USACO21FEB] Comfortable Cows B
    思路由于每次输入\(x\)和\(y\)只改变其上下左右的值,所以每次只要更新其相邻的值即可。当某个位置相邻的奶牛数达到\(3\)时,舒适度加一。当某个位置相邻的奶牛数达到\(4\)时,舒适度减一。注意:每增加一头奶牛以后,如果该位置相邻正好有三头奶牛,则舒适度也要加一。ACcod......
  • 牛客周赛 Round 56 C题异或故事
    链接:https://ac.nowcoder.com/acm/contest/88392/C这题考察的知识点是异或。关于异或,我们应该掌握以下知识点:1.两个相同的数异或的结果为0;2.0和任意一个非零的数异或的结果都是那个非零实数本身;3.a^b^c=a^(b^c)=(a^b)^c;4.d=a^b^c-->a=d^b^c;5.a^b^a=b;6.a^b=b^a.7.......