CF1369E. DeadLee 思维

news/2024/7/15 18:08:33 标签: 贪心算法, 算法, 图论

Link
思维,贪心,拓扑排序 2400

题意

n n n种菜,每种菜都有 w i w_i wi碟,你有 m m m个朋友,每个朋友都有两种喜欢的菜,你按照某个排序让朋友一个一个来吃菜,如果现在桌上有这个朋友喜欢的菜,他就会每种都吃一碟,但是如果两种菜都没了,你就会死。问你最后你会不会死,如果不会输出这个排序。

思路

显然,如果第 i i i 种菜的需求不大于 w i w_i wi,那么吃这种菜的人一定能吃到,我们贪心地把这些人往后排。同时对于这些人,它们已经吃了一种菜 i i i了,那么对于他们喜欢的另一种菜 j j j,需求就会少1。发现这一过程类似于拓扑排序,考虑建一张图:
n n n个点分别为每个菜,而 2 ∗ m 2*m 2m条边 < u , v > <u,v> <u,v>分别连接每个朋友喜欢的两种菜 u , v u, v u,v,并分别用 w [ i ] , i n [ i ] w[i],in[i] w[i]in[i]表示第 i i i个菜有多少碟以及需求量,容易发现需求量和拓扑排序里的入度很像。起初把需求量不超过碟数的点加入队列,然后每次将队首元素与其到达的点 v v v 入度减1,若 i n [ v ] = = w [ v ] in[v] == w[v] in[v]==w[v]则加入队列。同时将这条边所代表的朋友加入栈(无论是否in[v] == w[v]),最后判断栈中元素数量是否为m即可。

代码

int n, m;
int w[maxn];
vector<pair<int, int> > e[maxn];
int in[maxn];
bool vis[maxn];
queue<int> q;
stack<int> ans;
void solve() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> w[i];
    for(int i = 1; i <= m; i++) {
        int x, y;
        cin >> x >> y;
        e[x].pb(make_pair(y,i));
        e[y].pb(make_pair(x,i));
        in[x]++; in[y]++;
    }
    for(int i = 1; i <= n; i++) {
        if(in[i] <= w[i]) q.push(i);
    }
    while(!q.empty()) {
        int x = q.front();
        q.pop();
        for(auto i : e[x]) {
            int to = i.first;
            int a = i.second;
            in[to]--;
            if(!vis[a])
            {
                ans.push(a);
                vis[a] = 1;
            }
            if(in[to] == w[to]) 
                q.push(to);
        }
    }
    if(ans.size() < m) {
        cout << "DEAD\n";
        return;
    }
    cout << "ALIVE\n";
    while(!ans.empty()) {
        cout << ans.top() << ' ';
        ans.pop();
    }
    cout << endl;
}

http://www.niftyadmin.cn/n/1764870.html

相关文章

c语言推断数是否是素数

这是推断数是否是素数。网络版非常。我觉得有点问题。今天一个朋友问我这个问题。我知道&#xff0c;今天&#xff0c;我把自己的代码&#xff0c;非常实用哦&#xff01;。 #include<stdio.h> #include<math.h> int Prime(unsigned int a) { unsigned int i;…

D. Range and Partition

Link 思维二分 1800 题意 给定一个数组aaa&#xff0c;请给定一个值域范围[x, y]&#xff0c;并将其分为 kkk 段连续的子数组&#xff0c;使得每一段子数组中&#xff0c;在范围内的数总是严格大于不在范围内的数的个数。请最小化y−xy - xy−x &#xff0c;并输出对应的[x,y…

Ztree异步树加载

JSP代码片段 <% page language"java" contentType"text/html; charsetutf-8"pageEncoding"utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">…

CF1627D. Not Adding

Link gcd 思维 1900 题意 设 gcd(S)gcd(S)gcd(S) 为集合 SSS 中所有数的gcd&#xff0c;现给出集合 SSS &#xff0c;求它的所有子集的gcd中不属于SSS的数有多少个(n,ai≤1e6n, a_i \leq 1e6n,ai​≤1e6) 思路 若 xxx 在新集合中出现&#xff0c;则它一定是原集合中几个 xx…

CF1547F. Array Stabilization (GCD version) *

Link gcd 思维 1900 题意 给定一个长度为n的数组, 下标从1~n. 其中an和a1相连(成环). 每轮操作得到一个新的数组b: 对于所有的i∈[1, n], b[i] gcd(a[i], a[i 1]) (b[n] gcd(a[n], a[1])). 最后把新数组b复制给原数组a. 问: 执行完多少轮操作后, a数组中的所有数字都相同.…

MQTT协议笔记之发布流程

MQTT协议笔记之发布流程 前言 这次要讲到客户端/服务器的发布消息行为&#xff0c;与PUBLISH相关的消息类型&#xff0c;会在这里看到。 PUBLISH 客户端发布消息经由服务器分发到所有对应的订阅者那里。一个订阅者可以订阅若干个主题(Topic name)&#xff0c;但一个PUBLISH消息…

CF1627E. Not Escaping *

Link dp&#xff0c;离散化&#xff0c; 2200 题意 有一栋 nnn 层高楼&#xff0c;每层有 mmm 个房间&#xff0c;现在需要从(1,1)→(n,m)(1,1) \rightarrow (n, m)(1,1)→(n,m)&#xff0c;同层间向左or右移动需要消耗 xix_ixi​ 点体力&#xff08;每层对应一个 xix_ixi​ …

JAVA环境安装配置

dk1.6 64位是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。 jdk1.6 64位安装教程 jdk1.6 64位JDK的安装路径&#xff1a;D:\Program Files\Java\jdk1.6.0_43 这是jre的安装路径&#xff1a;D:\Program Files\Java\jre6 安装完成后对环…