题目链接:
本蒟蒻又来献丑了,这道题我做的时候还不会C++,STL只想到了用C硬钢,所以有点冗长。
题目大意:
现在给你一个数字字符串,问能不能只删除这个字符串的子链一次而得到2020,当然2020就直接可以了,如果这个字符串满足条件,则输出“YES”,否则则输出“NO”;
题目思路:
对于原链,只能删除一次而得到2020。下面分几种情况:1.如果字符串中有2020,那么就看2020的前面和后面是否只有一端有数,如果两端都有数,那么就不可以;2.如果是不完整的2020,就看类似于A B C,A与C可以拼成2020,所以只能有B这一个子链插在A与C之间,不然就没办法只删除一次。对于这种情况,我分了2+020,20+20,与202+2这三种情况。
AC代码:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
while(n>0)
{
int a[310],x,cnt=0,ret=0,i=1,j=0,flag=0;
char s[310];
scanf("%d",&x);
scanf("%s",s);
for(i=0;i<x;i++)
a[i]=s[i]-'0';
for(i=0;i<=x-4;i++)
{//首先应该满足i<=x-4这个条件
cnt=0;
if(a[i]==2&&a[i+1]!=0)//2+020
{
for(j=i+1;j+2<x;j++)
{
if(a[j]==0&&a[j+1]==2&&a[j+2]==0)
{//两头不能有
if(i==0&&j+2==x-1&&flag==0)
{flag=1;printf("YES\n");break;}
}
}
}else if(a[i]==2&&a[i+1]==0&&a[i+2]!=2)//20+20
{
for(j=i+1;j+1<x;j++)
{
if(a[j]==2&&a[j+1]==0)
{
if(i==0&&j+1==x-1&&flag==0)
{flag=1;printf("YES\n");break;}
}
}
}else if(a[i]==2&&a[i+1]==0&&a[i+2]==2&&a[i+3]!=0)//202+0
{
for(j=i+3;j<x;j++)
{
if(a[j]==0)
{
if(i==0&&j==x-1&&flag==0)
{ flag=1;printf("YES\n"); break;}
}
}
}else if(a[i]==2&&a[i+1]==0&&a[i+2]==2&&a[i+3]==0)//2020
{//两头只能有一个
if(i!=0) cnt++;
if(i!=x-4) cnt++;
if(cnt<=1&&flag==0)
{ flag=1; printf("YES\n"); break;}
}
}
if(flag==0) printf("NO\n");
n--;
}
return 0;
}