AcWing第38场周赛题解

第38场周赛活动链接

problem.A AcWing4299 删点

统计y轴两边点数

代码

#include <iostream>

using namespace std;

int main()
{
    int n,l=0,r=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x,y;
        cin>>x>>y;
        if(x<0) l++;
        else r++;
    }

    if(l<=1||r<=1) puts("Yes");
    else puts("No");

    return 0;
}

problem.B AcWing4300 两种操作

1.bfs暴搜,直接算出n->1~2m所有情况所需步骤
2.贪心,\(*2\)\(-1\)都是二进制上的操作,往这个方向思考

代码 bfs

#include <iostream>
#include <cstring>

using namespace std;

const int N = 20010;

int n,m;
int q[N],d[N];

int main()
{
    cin>>n>>m;
    
    int tt=-1,hh=0;
    q[++tt]=n;
    
    memset(d,0x3f,sizeof d);
    d[n]=0;
    
    while(hh<=tt)
    {
        int t = q[hh++];
        
        int items[]={t-1,t*2};
        for(auto x:items)
            if(x>=1&&x<N&&d[x]>d[t]+1)
            {
                d[x]=d[t]+1;
                q[++tt]=x;
            }
    }
    
    
    cout<<d[m];
    
    return 0;
}

problem.C AcWing4301 截断数列

枚举分段数2~n,关键是能看出来当【段数】能整除sum并且这个除法得到的值就是每段该有的和值,且这个s数组在递增这件事。

代码

#include <iostream>

using namespace std;

const int N = 105;

int n;
string num;
int s[N];

int main()
{
    cin>>n>>num;
    for(int i=1;i<=n;i++)
        s[i]=num[i-1]-'0'+s[i-1];
    
    bool flag=false;
    for(int i=2;i<=n;i++)
    {
        if(s[n]%i==0)
        {
            int sum=s[n]/i;
            for(int j=1;j<=n;j++)
                if(sum==s[j]) sum+=s[n]/i;
            if(sum==s[n]+s[n]/i)
            {
                flag=true;
                break;
            }
        }
    }
    
    if(flag)
        puts("YES");
    else
        puts("NO");
    
    return 0;
}
posted @ 2022-02-13 15:03  泝涉江潭  阅读(27)  评论(0)    收藏  举报