NBUT[1019]: 拔树

本文解析了一道关于在树的排列中拔除特定数量的树,以最大化剩余树间最大空隙的算法题。通过遍历树的排列,计算不同空隙长度,更新并输出最大空隙值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张宜强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值