2020牛客多校第三场 A题Clam and Fish(贪心)

2020牛客多校第三场 A题Clam and Fish(贪心)

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
",ans1);
	}
}

原文地址:https://www.cnblogs.com/whitelily/p/13337759.html