CDOJ 763 树上的鸟儿(水题/模拟题)

来源:互联网 发布:135端口入侵 编辑:程序博客网 时间:2024/05/08 14:25

树上的鸟儿

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

作为电子科大的一员,大家都知道,我们校园有很多高大的银杏树,现在小明正在观察一棵树上的鸟儿,他发现了一些规律。

在这个树上,有一些雄鸟和雌鸟(小明很厉害,能分得出鸟儿的雄雌),假如来了一只雄鸟,它会在树上唱歌,如果p分钟内有一只雌鸟飞来和它一起唱,它们就会一直呆在树上不走了,否则p分钟之后,这只雄鸟就会飞走。假如来的是只雌鸟,如果没有落单的雄鸟在树上,它不会落到树上而是直接飞走,否则它会选择等待时间最长的雄鸟和它一起唱歌,就再也不走了。

现在小明记录了一段时间飞来这个银杏树的鸟儿,每隔一分钟可能会飞来一只雌鸟或雄鸟,或者什么都没有发生,现在小明想知道这段时间内树上最多有多少只鸟儿,你可以帮助他吗?

Input

首先输入一个正整数TT50,表示有T组数据。

每组第一行给出两个整数np,分别表示记录时间段的长度,和每个雄鸟最多能等待的时间(1<n≤1000,1≤p≤10)。

第二行为一个长度为n的字符串,由 012三种字符构成,表示这段时间内鸟儿飞来的情况,0表示没有鸟飞来,1表示来的是雄鸟,2表示来的是雌鸟。

Output

每组数据输出一行只包含一个数,表示最多的鸟儿数量。

Sample input and output

Sample InputSample Output
510 1121212121210 3111112222216 322211122222111112 1225 411111
106904

Hint

如果在某个时刻,同时发生了鸟儿的飞进飞出,那么先有一只鸟儿飞出枝头,再由另一只鸟儿飞上枝头,参考第三组样例,第15只鸟飞上枝头的时候,第12只鸟已经离开了。第12只鸟离开的原因是因为第15只是雄鸟,如果第15只是雌鸟,第12只就不会飞走了。


此题很水,只是中了两个坑,,,刚开学时做的题,那是还很渣,不会查错,发到贴吧里,也没人回答。

然后现在会写对拍了,网上搜个代码,轻松拍出了错误,这个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 1020char 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;}


0 0