NBUT[1019]: 拔树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41505957/article/details/84554522

https://ac.2333.moe/Problem/view.xhtml?id=1019

  • 问题描述
  • 虽然这不是一个好榜样,但是为了留下足够的空隙,XadillaX还是决定去拔掉一些树。

    这些树是整齐地排成一排,用"|"表示,中间的空隙用空格" "表示,首和尾肯定是一棵树。一个空格代表一个单位的空格。

    现在让你拔掉一定数量的树,使新的队列中最大的那个空隙最大。(忽略树本身的空隙,如果两棵树是紧挨着的,那么拔掉之后的空隙也是0)

    | || | |

    这么个排列,如果让你拔掉两棵树,那么最大空隙是2,即

    |  | |或者| |  |
  • 输入
  • 本题有多组数据,输入到EOF结束。
    每组数据第一行一个正整数N(1 <= N <= 1000),代表需要拔掉的树的数量。
    接下去一行为树的排列顺序,仅包含"|"和" ",长度不超过10000。N不会超过树的数量减2的。

  • 输出
  • 对于每组数据,输出拔树之后的最大空隙。

  • 样例输入
  • 2
    | |  | | |
  • 样例输出
  • 4
    

判断 i 到 j 之间有多少树和空,更新答案。

#include<stdio.h>
#include<string.h>
#define N 10020
char str[N];
int maxn(int a,int b)
{
	return a>b?a:b;
}
int main()
{
	int m,i,j,ans,len,sum;
	while(scanf("%d",&m)!=EOF)
	{
		getchar();
		gets(str);
		len=strlen(str);
		sum=0;
		ans=0;
		for(i=0;i<len;i++)
			if(str[i]!='|')
				break;
		
		for(j=i;j<len&&i<len;j++)
		{
			if(str[j]=='|')
				sum++;
			while(sum>m)
			{	
				if(str[i]=='|')
					sum--;
				i++;			
			}
				
			if(str[j]=='|') 
				ans=maxn(ans,j-i-sum-1);
			else
				ans=maxn(ans,j-i-sum+1);	
		}
		printf("%d\n",ans);
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_41505957/article/details/84554522