链接:
https://codeforces.com/problemset/problem/1526/C1
题意:
有n瓶药水,从1到n,每瓶药水可以为你回复a[i]点血,a[i]也可以是负的,必须按顺序喝,问最多可以喝多少瓶药水,途中血量不能为负。
本题用优先队列存所有扣血的血瓶,一路上一直喝,一直喝到血量为负,就后悔,不喝那个扣血最多的血瓶,然后接着往下喝。
代码如下:
#include<iostream>
#include<queue>
#include<vector>
#include<cmath>
#include<map>
#include<algorithm>
#include<string>
#include<string.h>
#include<random>
using namespace std;
typedef long long ll;
int a[2003];
int main() {
int n;
cin >> n;
ll sum = 0;
int cnt = 0;
priority_queue<int>q;
for (int i = 0; i < n; i++) {
cin >> a[i];
sum += a[i];
cnt++;
if (a[i] < 0) {
q.push(-a[i]);
}
if (sum < 0) {
int top = q.top();
q.pop();
sum += top;
cnt--;
}
}
cout << cnt;
return 0;
}