快捷搜索: 王者荣耀 脱发

cf 723 C2. Potions (Hard Version)(反悔,priority)

难过,就差一点点…… 大致翻译: 这是问题的硬版本。唯一的区别是在这个版本中≤20万。只有两个版本的问题都解决了,你才能进行黑客攻击。

一行有n种药剂,药剂1在最左边,药剂n在最右边。每一种药剂都会增加你的生命值。ai可以是负的,意味着药剂会降低生命值。

你从0点生命值开始,从左到右,从第一个魔药到最后一个魔药。在每一个药水,你可以选择喝它或忽略它。你必须确保你的健康永远是非负的。

你能喝的药水最多是多少?

输入

第一行包含一个整数n(1)≤n≤200000)-药剂的数量。

下一行包含n个整数a1,a2,安(−109≤人工智能≤109)代表饮用该药剂后健康状况的变化。

输出

输出一个整数,即您可以饮用的最大药剂量,而您的健康值不会变为负值。

例子

输入副本

6

4 -4 1 -3 1 -3

输出副本

5

注意

对于这个样本,你可以通过服用药剂1、3、4、5和6来喝5种药剂。不可能全部喝下6种药剂,因为你的健康状况在某个时候会变为阴性 我的代码:(昨天忘记判空了,我气!!!)

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-6
typedef long long ll;
const int maxx=200020;
const int mod=998244353;
typedef long long ll;
ll a;

int main(){
          
   
	int ans=0,n;
	scanf("%d",&n);
	ll sum=0;
	priority_queue<ll,vector<ll>,greater<ll>>p;
	for(int i=0;i<n;i++){
          
   
		scanf("%lld",&a);
		if((sum+a)>=0){
          
   
			if(a<0)p.push(a);
			sum+=a;
			ans++;
//			cout<<"111 "<<sum<<"   "<<ans<<endl;
		}
		else if(!p.empty()){
          
   //注意判空!!!
		//找吃里最小的对比,若比最小的大就把它吐出来吃当前的
			int c=p.top();
			if(a>c){
          
   
				p.push(a);
				p.pop();
				sum+=abs(a-c);
			}
		}
	}
	printf("%d",ans);
    return 0;
}
经验分享 程序员 微信小程序 职场和发展