2020牛客多校第三场 A题Clam and Fish(贪心)
2020牛客多校第三场 A题Clam and Fish(贪心)
题意:4种状态;
0:无鱼无饵
1:无鱼有饵
2:有鱼无饵
3:有鱼有饵
有鱼可以拿鱼,有饵可以拿饵,无鱼可以用一个饵拿鱼,或什么都不做,4种操作只能选一个,求最多的鱼。
题解:直接放弃dp考虑贪心,dp复杂度要n方。对于3,4肯定直接拿鱼是最赚的,0有饵用饵,1有抉择要用饵还是拿饵,稍微考虑一下怎么拿最赚,如果之后有0,那把饵留个之后的0最好,所以不难想出,我记录一下0的数量,尽量保留那个数量的饵留个之后的0,多出来的就去换鱼。
#include<iostream>
using namespace std;
int t,n,s,slin;
char a[2000007];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
scanf("%s",a);
s=0;
slin=0;
for(int i=0;i<n;i++){
if(a[i]=='0')s++;
}
int ans1=0,ans2=0;
for(int i=0;i<n;i++){
if(a[i]=='0'){
slin++;
if(ans2>0){
ans2--;
ans1++;
}
}
else if(a[i]=='1'){
if((slin+ans2)<=s){
ans2++;
}
else{
if(ans2>0){
ans2--;
ans1++;
}
else{
ans2++;
}
}
}
else if(a[i]=='2'){
ans1++;
}
else{
ans1++;
}
}
printf("%d\n",ans1);
}
}