Codeforces 1271D - Portals (反悔型贪心)

Description

思路

题目中关键之处是必须先要把所有城堡都攻打下来,因此可以使用贪心。重要事实:对于城堡 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;
}
 
posted @ 2020-04-02 13:12  limil  阅读(145)  评论(0编辑  收藏  举报