YTU 2895: H--唱歌的鸟儿
2895: H--唱歌的鸟儿
时间限制: 1 Sec 内存限制: 128 MB提交: 26 解决: 10
题目描述
烟大东门有一棵大杨树,树上经常会有很多鸟儿飞来飞去。春天来了,学生物的小姜发现了一些规律。在这棵杨树上,假如来了一只雄鸟,它会在树上唱歌,如果 p 分钟内有一只雌鸟飞来和它一起唱,它们就会一直呆在树上不走了,否则 p 分钟之后,这只雄鸟就会飞走。假如来的是只雌鸟,如果没有落单的雄鸟在树上,它不会落到树上而是直接飞走,否则它会选择等待时间最长的雄鸟和它一起唱歌,就再也不走了。如果在某个时刻,同时发生了鸟儿的飞进飞出,那么先有一只鸟儿飞出枝头,再由另一只鸟儿飞上枝头。
现在小姜记录了一段时间飞来这棵杨树的鸟儿,每隔一分钟可能会飞来一只雌鸟或雄鸟,或者什么都没有发生,现在小姜想知道这段时间内树上最多有多少只鸟儿,你可以帮助他吗?
输入
首先输入一个正整数T,T <= 50,表示有T组数据。
每组第一行给出两个整数n、p,分别表示记录时间段的长度,和每个雄鸟最多能等待的时间(1 < n <= 1000,1 <= p <= 10)。
第二行为一个长度为n的字符串,由 0, 1, 2 三种字符构成,表示这段时间内鸟儿飞来的情况,0表示没有鸟飞来,1表示来的是雄鸟,2表示来的是雌鸟。
输出
每组数据输出一行只包含一个数,表示最多的鸟儿数量。
样例输入
5
10 1
1212121212
10 3
1111122222
16 3
2221112222211111
2 1
22
5 4
11111
样例输出
10
6
9
0
4
提示
参考第三组样例,第15只鸟飞上枝头的时候,第12只鸟已经离开了。第12只鸟离开的原因是因为第15只是雄鸟,如果第15只是雌鸟,第12只就不会飞走了。
你 离 开 了 , 我 的 世 界 里 只 剩 下 雨 。 。 。
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #define N 1005 struct node { int a,b; } f[N]; char str[N]; int max(int a,int b) { return a>b?a:b; } int main() { int i,j,n,p,T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&p); memset(f,0,sizeof(f)); scanf("%s",str); for(i=0; i<n; i++)f[i].a=str[i]-'0'; for(i=0; i<n; i++) { if(f[i].a==2) { for(j=max(0,i-p); j<i; j++) if(f[j].a==1&&f[j].b!=-1) { f[j].b=-1; f[i].b=-1; break; } } } int t=0,cnt=0,ans=0; for(i=0; i<n; i++) { cnt=0; if(f[i].b==-1)t++; if(i-p<0)j=0; else j=i-p+1; for(; j<=i; j++) if(f[j].a==1&&f[j].b!=-1)cnt++; ans=max(ans,t+cnt); } printf("%d\n",ans); } return 0; }
------------------- 这是千千的个人网站哦! https://www.dreamwings.cn -------------------