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

题目链接:https://ac.nowcoder.com/acm/contest/5668/A
解题思路:
利用贪心
有四种池塘 0 1 2 3
遇到2 3有鱼的池塘直接钓鱼,因为即使是备饵也是只能钓一条,不如直接抓获得一条,所以遇到s[i]=‘2’ 或‘3’时直接ans++
对于0这种池塘,是有鱼饵的话直接使用
对于1这种池塘,有使用鱼饵进行钓鱼和备饵两种选择,主要取决于后面池塘的情况。所以从后往前进行逆序遍历,使用emp记录当前空塘数量,clam记录待用有饵池塘数量
遇到2 3,ans++
遇到0, 则emp++,相当于当前需要一个鱼饵
遇到1,如果当前emp=0,则clam++,如果emp>0,则emp–,并使ans++
最后再对空置有饵池塘进行处理即可,即每两个有饵池塘可以相当于钓一条鱼,ans+=clam/2

#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
using namespace std;
int n;
int t;
int ans;
int clam;
int emp;
string a;
int main(){
	scanf("%d",&t);
	while(t--){
		ans=0;
		clam=0;
		emp=0;
		scanf("%d",&n);
		cin>>a;
		for(int i=n-1;i>=0;i--){
			if(a[i]=='2'||a[i]=='3')
				ans++;
			if(a[i]=='0'){
				emp++;
			}
			if(a[i]=='1'){
				if(emp>0){
					ans++;
					emp--;
				}
				else{
					clam++;
				}
			}
		}
		ans+=clam/2;
		printf("%d\n",ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/littlegoldgold/article/details/107435199