zoukankan      html  css  js  c++  java
  • Codeforces 1271D

    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;
    }
     
    
  • 相关阅读:
    apt update ,apt upgrade 和 apt dist-upgrade 的区别
    CVE-2018-8639 简单利用 win7
    如何拆解性能测试需求
    博客搬家啦
    驱动开发学习一
    驱动开发基础之数据结构
    c++容器加迭代器和python装饰器的对比
    c++简单学习
    windows下z3安装
    switch反汇编
  • 原文地址:https://www.cnblogs.com/limil/p/12619085.html
Copyright © 2011-2022 走看看