首先我们分析一下四条操作:
明显,第四条就是来打酱油的,所以不用管
再看第二条,也就是说如果当前时刻有何士奇,我们可以在不花费任何诱饵的情况下捕获到一只何士奇
接下来看第三条,如果你有诱饵,那么你就可以捕获到一只何士奇,即使当前时刻没有何士奇
最后来看第一条:
如果只有一只乔子王,那么有两种情况:
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);
}
}