作为电子科大的一员,大家都知道,我们校园有很多高大的银杏树,现在小明正在观察一棵树上的鸟儿,他发现了一些规律。
在这个树上,有一些雄鸟和雌鸟(小明很厉害,能分得出鸟儿的雄雌),假如来了一只雄鸟,它会在树上唱歌,如果 p 分钟内有一只雌鸟飞来和它一起唱,它们就会一直呆在树上不走了,否则 p 分钟之后,这只雄鸟就会飞走。假如来的是只雌鸟,如果没有落单的雄鸟在树上,它不会落到树上而是直接飞走,否则它会选择等待时间最长的雄鸟和它一起唱歌,就再也不走了。
现在小明记录了一段时间飞来这个银杏树的鸟儿,每隔一分钟可能会飞来一只雌鸟或雄鸟,或者什么都没有发生,现在小明想知道这段时间内树上最多有多少只鸟儿,你可以帮助他吗?
Input
首先输入一个正整数 T , T≤50 ,表示有 T 组数据。
每组第一行给出两个整数 n 、 p ,分别表示记录时间段的长度,和每个雄鸟最多能等待的时间( 1<n≤1000,1≤p≤10 )。
第二行为一个长度为
n
的字符串,由 0
, 1
, 2
三种字符构成,表示这段时间内鸟儿飞来的情况,0
表示没有鸟飞来,1
表示来的是雄鸟,2
表示来的是雌鸟。
Output
每组数据输出一行只包含一个数,表示最多的鸟儿数量。
Sample input and output
Sample Input | Sample Output |
---|---|
5 10 1 1212121212 10 3 1111122222 16 3 2221112222211111 2 1 22 5 4 11111 | 10 6 9 0 4 |
Hint
如果在某个时刻,同时发生了鸟儿的飞进飞出,那么先有一只鸟儿飞出枝头,再由另一只鸟儿飞上枝头,参考第三组样例,第 15 只鸟飞上枝头的时候,第 12 只鸟已经离开了。第 12 只鸟离开的原因是因为第 15 只是雄鸟,如果第 15 只是雌鸟,第 12 只就不会飞走了。
#include <iostream>
#include <stdio.h>
using namespace std;
char str[1010];
int a[1010];
int main()
{
int t,n,p;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&p);
scanf("%s",str);
for (int i=0;i<n; i++)
a[i]=str[i]-'0';
int ans=0;
for (int i=0; i<n; i++)
{
if(a[i]==1)
{
for (int j=i+1; j<=i+p && j<n; j++) //处理可以在时间段p内配对的鸟
{
if(a[j]==2)
{
a[i]=3; //更改已配对的的标记
a[j]=3;
break;
}
}
}
}
int Max=0;
for (int i=0; i<n; i++)
{
int cnt=0;
int m=0;
if(i+p>n)
m=n;
else
m=i+p;
for (int j=i; j<m; j++)
{
if(a[j]==1) //找未配对但是在该时间段内还留着树上的鸟
cnt++;
else if(a[j]==3) //已留在树上的鸟儿
{
a[j]=0; //更改标记
ans++;
}
}
if(Max<ans+cnt) //每个时间段都要更新
Max=ans+cnt;
}
printf("%d\n",Max);
}
return 0;
}