uestc 1904 树上的鸟儿

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

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

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

Input

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

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

第二行为一个长度为 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 只就不会飞走了。

#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;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值