1. 程式人生 > >NBUT[1019]: 拔樹

NBUT[1019]: 拔樹

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