牛客寒假算法集训4-总结

A

思路:
签到题

AC代码:

#include <bits/stdc++.h>

using namespace std;

int a,b,k;

int main()
{
    cin>>a>>b>>k;
    if(a>=k*b) cout<<"good"<<endl;
    else cout<<"bad"<<endl;
    return 0;
}

B

思路:
博弈论

AC代码:

#include <bits/stdc++.h>

using namespace std;

const int N=2e5+10;

int n,sum;
int a[N];

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) {cin>>a[i];sum+=a[i];}
    
    if(sum%2==0)
    {
        if(n%2!=0) cout<<"gui"<<endl;
        else cout<<"sweet"<<endl;
    }
    
    else
    {
        if(n%2!=0) cout<<"sweet"<<endl;
        else cout<<"gui"<<endl;
    
    }
    
    return 0;
}

C

思路:
暴力模拟

时间复杂度:
O(nm+pqmax(n,m))

AC代码:

#include <bits/stdc++.h>

using namespace std;

const int N=110;

int q,n,m,x,y,p;
char g[N][N];
int op[N],z[N];

void removex(int z)
{
    char mp=g[z][m];
    for(int i=m;i>1;i--) g[z][i]=g[z][i-1];
    g[z][1]=mp;
}

void removey(int z)
{
    char mp=g[n][z];
    for(int i=n;i>1;i--) g[i][z]=g[i-1][z];
    g[1][z]=mp;
}

int main()
{
    cin>>n>>m>>x>>y;
    for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>g[i][j];
    cin>>p>>q;
    int xx=p*q;
    
    for(int i=1;i<=q;i++) cin>>op[i]>>z[i];
    
    int k=1;int oo=1;
    
    while(xx--)
    {
    	int zx,opx;
    	if(k==q+1) {k=1;oo=1;}
        opx=op[k++];zx=z[oo++];
        if(opx==1)
        {
            removex(zx);
        }
        else
        {
            removey(zx);
        }
    }
    
    //for(int i=1;i<=n;i++)
    //	for(int j=1;j<=m;j++)
    //	cout<<g[i][j];
    
    
    cout<<g[x][y]<<endl;
    return 0;
}

D

思路:
先对所有数求和,记为sum 假设这n个数的最大公约数为g,则g一定是sum的因子。 且因为这个数至少都为g,所以sum/g>=n

时间复杂度:
O(n+ ∑a)

AC代码:

#include <bits/stdc++.h>

using namespace std;

const int N=2e5+10;
map<int,int> mp;

int a[N];
int n,cnt,sum,k;

int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    
   mp[0]=1;
    
    for(int i=1;i<=n;i++)
    {
        sum+=a[i];
        if(mp[sum%k]) cnt++,sum=0,mp.clear(),mp[0]=1;
        else mp[sum%k]=1;
    }
    
    cout<<cnt;
    return 0;
}

E

思路:
从左往右选,如果有合法区间就选上,最后选中区间数就是最大了。唯一一个比较巧妙的地方是,怎么判断有没有可以和当前点组成合法区间的左端点,但这实际上也是一种比较典的思路,把所有左端点存起来,然后每读一个端点,用前缀和或者其他区间查询,检查有没有合法左端点。由于合法区间不能重叠,每次配对后,都要把前面存的左端点都删掉。

时间复杂度:
o(logn)

AC代码:

#include <bits/stdc++.h>

using namespace std;

const int N=2e5+10;
map<int,int> mp;

int a[N];
long long n,cnt,sum,k;

int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    
   mp[0]=1;
    
    for(int i=1;i<=n;i++)
    {
        sum+=a[i];
        if(mp[sum%k]) cnt++,sum=0,mp.clear(),mp[0]=1;
        else mp[sum%k]=1;
    }
    
    cout<<cnt;
    return 0;
}
posted @   Eric`  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示