NOJ [1019] 拔树 模拟小水题

  • [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;
}

注意:一个程序拍出来了 不要马上就交  看看有木有错再交 稳中求胜


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值