1462B - Codeforces(寻找2020)

题目链接

Problem - 1462B - Codeforces

本蒟蒻又来献丑了,这道题我做的时候还不会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;
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值