-
[1019] 拔树
- 时间限制: 1000 ms 内存限制: 65535 K
- 问题描述
-
虽然这不是一个好榜样,但是为了留下足够的空隙,XadillaX还是决定去拔掉一些树。
这些树是整齐地排成一排,用"|"表示,中间的空隙用空格" "表示,首和尾肯定是一棵树。一个空格代表一个单位的空格。
现在让你拔掉一定数量的树,使新的队列中最大的那个空隙最大。(忽略树本身的空隙,如果两棵树是紧挨着的,那么拔掉之后的空隙也是0)
如
| || | |
这么个排列,如果让你拔掉两棵树,那么最大空隙是2,即
| | |或者| | |
- 输入
-
本题有多组数据,输入到EOF结束。
每组数据第一行一个正整数N(1 <= N <= 1000),代表需要拔掉的树的数量。
接下去一行为树的排列顺序,仅包含"|"和" ",长度不超过10000。N不会超过树的数量减2的。 - 输出
-
对于每组数据,输出拔树之后的最大空隙。
- 样例输入
-
2| | | | |
- 样例输出
-
4
- 提示
-
无
- 来源
-
XadillaX
- 操作
思路 : 把2课树之间的距离保存起来 选出连续的n+1个的和 使其最大即可
#include<stdio.h>
#include<string.h>
char s[11111];
int a[11111],sum[11111];
int main()
{
int n,i,j,cnt;
while(scanf("%d",&n)!=EOF)
{
cnt=0;
getchar();
gets(s);
int d=strlen(s);
int x1=0,x2;
for(i=1;i<d;i++)
{
if(s[i]=='|')
{
x2=i;
a[cnt++]=x2-x1-1;//把相邻2个树的距离保存到a数组中
x1=x2;
}
}
sum[0]=0;//注意这里是0哦 因为如果我们求i到j的和 其应为sum[i]-sum[j-1] 对于假如求0到2的和 就应为sum[2]-sum[0-1] 这样是不合法的 所以我们把sum往后推迟一个
sum[1]=a[0];
for(i=2;i<=cnt;i++)
{
sum[i]=sum[i-1]+a[i-1];
}
int ans=0,mmax=0;
for(i=cnt;i>=0&&i>=n+1;i--)
{
ans=sum[i]-sum[i-n-1];
if(ans>mmax) mmax=ans;
}
printf("%d\n",mmax);
}
return 0;
}
注意:一个程序拍出来了 不要马上就交 看看有木有错再交 稳中求胜