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

46 篇文章 0 订阅

树上的鸟儿

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

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

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

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

Input

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

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

第二行为一个长度为 n 的字符串,由 012三种字符构成,表示这段时间内鸟儿飞来的情况,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 只就不会飞走了。


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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值