CF1562C题解

打了vp后打算来写一篇题解。

感觉我的思路还是比较特殊。

将正值的药称为保健品,负值的药称为毒药。

首先保健品是肯定要喝的。毒药的要尽量多喝。

要多喝毒药,就要尽量喝毒性弱的(也就是绝对值小的)。

可以倒序循环,找到毒药就将其放入一个堆中,堆中毒性弱的在上。

找到保健品时,努力将其透支。用保健品的效果从毒性的弱到强吃毒药。如果保健品不足以将毒药吃掉,那么用保健品将毒药的毒性削弱。

可以证明:此时的保健品只能用于此时堆中的毒药,方法一定最优。

如果没看懂,请看代码:

#include<bits/stdc++.h>
using namespace std;
#define N 200001
int n,a[N],t[N],num,ans;
priority_queue<int>heap;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",a+i);
		if(a[i]>=0)++ans;
	}
	for(int i=n;i>=1;--i){
		if(a[i]<0)heap.push(a[i]);
		if(a[i]>0){
			while(!heap.empty()&&a[i]>=-heap.top()){
				a[i]+=heap.top();heap.pop();++ans;
			}
			if(!heap.empty()){
				int x=heap.top();heap.pop();
				x+=a[i];heap.push(x);
			}
		}
	}
	printf("%d\n",ans);
	return 0;
}
posted @ 2022-05-28 14:39  Andy__Lin  阅读(82)  评论(0)    收藏  举报