2020-08-26

首先我们分析一下四条操作:
明显,第四条就是来打酱油的,所以不用管
再看第二条,也就是说如果当前时刻有何士奇,我们可以在不花费任何诱饵的情况下捕获到一只何士奇
接下来看第三条,如果你有诱饵,那么你就可以捕获到一只何士奇,即使当前时刻没有何士奇
最后来看第一条:
如果只有一只乔子王,那么有两种情况:
1.如果有诱饵,就用诱饵捕获一只何士奇
2.将这只乔子王做成诱饵
那这种情况怎么处理呢?
其实很简单,我们只要一开始将所有的只有一只乔子王的时刻将乔子王做成诱饵,在最后的时候判断一下剩余诱饵的数量是否大于二,如果大于二,说明肯定可以在某一只有乔子王的时刻花费一包诱饵去捕获一只何士奇。
具体细节请看代码

#include<bits/stdc++.h>
using namespace std;
int t, n, x, i, ans;
char s[2000005];
int main(){
    scanf("%d", &t);
    while(t--){
        scanf("%d", &n);
        cin >> s;
        ans = 0;//ans表示最多能捕获的何士奇数量
		x = 0;//x表示诱饵数量 
        i = 0;
        bool flag = 0;
        while(s[i] == '0') i++;//首先将无用的操作去掉,前导0没有任何用处 
        for(; i < n ; i++){
            if(s[i] == '2' || s[i] == '3'){
                ans++;
                continue;
            }//贪心,只要有何士奇就抓 
            if(flag == 0 && s[i] == '1') flag=1;
            if(flag == 1 && s[i] == '1') x++;//此时没有何士奇但有一个乔子王,就用乔子王做一包诱饵 
            if(flag == 1 && s[i] == '0' && x) ans++ ,x--;//此时消耗一包诱饵来捕获一只何士奇 
        }
        if(x >= 2) ans += x / 2;//剩余诱饵数/2向下取整,因为当有两个时刻有乔子王没有何士奇时前者的诱饵可以在后者只有乔子王没有何士奇时捕获一个何士奇,以达到最大
        printf("%d\n", ans);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值