zoukankan      html  css  js  c++  java
  • Codeforces Round #652 (Div. 2) E. DeadLee(贪心)

    题目链接:https://codeforces.com/contest/1369/problem/E

    题意

    Lee 有 $n$ 种不同种类的食物和 $m$ 个朋友,每种食物有 $w_i$ 个,每个朋友喜欢吃两种食物 $x_i, y_i$,如果一个朋友被叫去厨房时一个喜欢吃的食物也没有,他就会吃掉 Lee,否则对还有的他喜欢吃的食物一种吃掉一个,问是否存在一个叫朋友去厨房的顺序保证 Lee 不会被吃掉。

    题解

    设 $s_i$ 为第 $i$ 种食物共需要多少个,若 $w_i ge s_i$,则喜欢第 $i$ 种食物的朋友一定不会吃 Lee,最优起见,可以最后再叫他们,同时他们喜欢的另一种食物也可以省下来了。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        int n, m; cin >> n >> m;
        int w[n] = {};
        for (int i = 0; i < n; i++)
            cin >> w[i];
        vector<pair<int, int>> e[n];
        int s[n] = {};
        for (int i = 0; i < m; i++) {
            int u, v; cin >> u >> v;
            --u, --v;
            e[u].emplace_back(v, i);
            e[v].emplace_back(u, i);
            ++s[u], ++s[v];
        }
        queue<int> que;
        for (int i = 0; i < n; i++)
            if (w[i] >= s[i])
                que.push(i);
        vector<int> ans;
        bool vis[m] = {};
        while (!que.empty()) {
            int u = que.front();
            que.pop(); 
            for (auto [v, i] : e[u]) {
                if (vis[i])
                    continue;
                vis[i] = 1;
                ans.push_back(i);
                if (--s[v] == w[v])
                    que.push(v);
            }
        }
        if (int(ans.size()) < m) {
            cout << "DEAD" << "
    ";
            return 0;
        }
        cout << "ALIVE" << "
    ";
        reverse(ans.begin(), ans.end());
        for (int i = 0; i < m; i++)
            cout << ans[i] + 1 << " 
    "[i == m - 1];
    }
  • 相关阅读:
    【刷题-LeetCode】165 Compare Version Numbers
    python 22 内置模块2
    python 21 内置模块
    python 20 模块,包,及开发目录规范
    python 19
    python 18 三元,生成,递推
    定时抓取数据并存入数据库
    抓取财报数据
    金币
    交换座位
  • 原文地址:https://www.cnblogs.com/Kanoon/p/13189658.html
Copyright © 2011-2022 走看看