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;
}

浙公网安备 33010602011771号