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;
}

浙公网安备 33010602011771号