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
",ans);
}
return 0;
}