作为电子科大的一员,大家都知道,我们校园有很多高大的银杏树,现在小明正在观察一棵树上的鸟儿,他发现了一些规律。
在这个树上,有一些雄鸟和雌鸟(小明很厉害,能分得出鸟儿的雄雌),假如来了一只雄鸟,它会在树上唱歌,如果 p 分钟内有一只雌鸟飞来和它一起唱,它们就会一直呆在树上不走了,否则 p 分钟之后,这只雄鸟就会飞走。假如来的是只雌鸟,如果没有落单的雄鸟在树上,它不会落到树上而是直接飞走,否则它会选择等待时间最长的雄鸟和它一起唱歌,就再也不走了。
现在小明记录了一段时间飞来这个银杏树的鸟儿,每隔一分钟可能会飞来一只雌鸟或雄鸟,或者什么都没有发生,现在小明想知道这段时间内树上最多有多少只鸟儿,你可以帮助他吗?
首先输入一个正整数 T , T≤50 ,表示有 T 组数据。
每组第一行给出两个整数 n 、 p ,分别表示记录时间段的长度,和每个雄鸟最多能等待的时间(1<n≤1000,1≤p≤10)。
第二行为一个长度为 n 的字符串,由 0
, 1
, 2
三种字符构成,表示这段时间内鸟儿飞来的情况,0
表示没有鸟飞来,1
表示来的是雄鸟,2
表示来的是雌鸟。
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 |
此题很水,只是中了两个坑,,,刚开学时做的题,那是还很渣,不会查错,发到贴吧里,也没人回答。
然后现在会写对拍了,网上搜个代码,轻松拍出了错误,这个feel,啊,好爽。有时间把对拍发上来^_^
坑:1,不知道为什么脑子抽的分为了[0,p-1]和[p,n-1]两部分,[0,p-1]里的雌鸟就被我忽视了,真的是,傻了
2,最后的鸟儿,记录它飞走的时间,当时判了一下,如果超了n就不记录了,因为肯定飞不走了嘛,但是忘了后面如果有雌鸟,怎么判断匹配的问题,
反正p也很小,在数组后面再延长十个单位就好了啊,就能把它们都记录下来。
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; #define maxn 1020 char bird[maxn]; int num[maxn]; bool fly[maxn]; int main() { int t; scanf("%d", &t); while (t--) { int n, p, max; max = 0; memset(bird, 0, sizeof(char)*maxn); memset(num, 0, sizeof(int)*maxn); memset(fly, 0, sizeof(bool)*maxn); scanf("%d %d", &n, &p); scanf("%s", bird); for (int i = 0; i < n; i++) { if (bird[i] == '2') { for (int j = i; j < i + p; j++) { if (fly[j] == 1) { for (int k = i; k < j; k++) num[k]++; for (int k = j; k < n; k++) num[k] += 2; fly[j] = 0; break; } } } else if (bird[i] == '1') { fly[i + p] = 1; for (int j = i; j < i + p; j++) num[j]++; } } for (int i = 0; i < n; i++) if (max < num[i]) max = num[i]; printf("%d\n", max); } return 0; }