Codeforces 1271D - Portals (反悔型贪心)
思路
题目中关键之处是必须先要把所有城堡都攻打下来,因此可以使用贪心。重要事实:对于城堡 i ,越到后面占领越好,因为越到后面兵力越足够。
每一个城堡对应一个它最远城堡,这样每一个城堡前面都有多个可占领的城堡。每攻打下一个城堡,就把能占领的城堡都占领了;当人手不够时,按照城堡重要程度低到高再把人要回来。如果人手还是不够,就无解。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 10000
#define inf 0x3f3f3f3f
int a[N], b[N], c[N];
int last[N];
vector<int> front[N];
priority_queue<int, vector<int>, greater<int>> q;
int main() {
int n, m, k;
cin >> n >> m >> k;
for(int i = 1; i <= n; i++) {
cin >> a[i] >> b[i] >> c[i];
last[i] = i;
}
int u, v;
for(int i = 0; i < m; i++) {
cin >> u >> v;
last[v] = max(last[v], u);
}
for(int i = 1; i <= n; i++) {
front[last[i]].push_back(c[i]);
}
int cur = k, ans = 0;
if(cur < a[1]) {
cout << "-1";
return 0;
}
for(int i = 1; i <= n + 1; i++) {
cur += b[i];
for(auto &cl : front[i]) {
cur--;
q.push(cl);
}
while(!q.empty() && cur < a[i + 1] ) {
cur++;
q.pop();
}
if(cur < a[i + 1]) {
cout << "-1";
return 0;
}
}
while(!q.empty()) ans += q.top(), q.pop();
cout << ans << endl;
}