题目链接:点击查看

题目大意:Lee的厨房中有 n 道菜,每道菜的数量为 w[ i ] ,现在 Lee 会邀请 m 个朋友,每个朋友都有最爱吃的两道菜 x[ i ] 和 y[ i ] ,当朋友 i 来到 Lee 家后,会选择吃掉 x[ i ] 和 y[ i ] 各一份,如果 x[ i ] 没有了的话,那么他只会选择吃掉一份 y[ i ] ,如果 y[ i ] 没有了的话同理,但是如果 x[ i ] 和 y[ i ] 同时没有的话,这个朋友就会吃掉 Lee,问 Lee 能否安排一个合适的顺序以保证存活,输出这个顺序

题目分析:读完题后,需要发现的一个重要信息是,设 sum[ i ] 为每道菜的需求量,那么如果 sum[ i ] <= w[ i ] 的话,那么这 sum[ i ] 个人是一定可以吃到菜的,我们只需要将其安排在最后来吃就好了,同理,如果所有的 sum[ i ] > w[ i ] 成立的话,那么将会是无解的,因为假设 min_w 为所有 w[ i ] 中的最小值,那么至少会有 min_w 个人需要吃两个菜,换句话说我们无论安排谁最后来,都是需要吃两个菜的,这与我们的贪心策略不符

分析完后,实现的话用拓扑的思想就好了,只不过将拓扑中 du[ i ] == 0 的条件换成了 sum[ i ] <= w[ i ] 而已

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;int w[N],sum[N],n,m;vector<pair<int,int>>node[N];stack<int>ans;bool vis[N];bool topo()
{queue<int>q;for(int i=1;i<=n;i++)if(sum[i]<=w[i])q.push(i);while(q.size()){int u=q.front();q.pop();for(auto it:node[u]){int v=it.first,id=it.second;if(vis[id])continue;vis[id]=true;ans.push(id);if(--sum[v]<=w[v])q.push(v);}}return ans.size()==m;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",w+i);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);node[x].emplace_back(y,i);node[y].emplace_back(x,i);sum[x]++,sum[y]++;}if(topo()){puts("ALIVE");while(ans.size()){printf("%d ",ans.top());ans.pop();}}elseputs("DEAD");return 0;
}

CodeForces - 1369E DeadLee(贪心+拓扑)相关推荐

  1. Codeforces1600数学day5[找规律CodeForces - 1059C,贪心数学A - Banh-mi CodeForces - 1062C ]

    A - Banh-mi CodeForces - 1062C 题目大意:就是开始给你一个01序列,和q次询问,每次询问会给你一个区间,每次你会从这个区间内拿出一个数,在区间内的其他未被拿走的数字会加上 ...

  2. CodeForces - 1494D Dogeforces(贪心+构造)

    题目链接:点击查看 题目大意:给出 nnn 个叶子结点和一个 n∗nn*nn∗n 的 LCALCALCA 矩阵,其中 LCALCALCA 表示的是最近公共祖先节点的权值,现在需要构造出一棵自顶向下权值 ...

  3. Codeforces 1203E Boxers(贪心)

    题目链接:https://codeforces.com/problemset/problem/1203/E 题意:给定n个数字,每个数字可以进行一次+1或是-1的变换(也可以不变),问通过对部分数字适 ...

  4. codeforces数学1600day4[贪心数学公式推导CodeForces - 1151D ,思维CodeForces - 1085C,数论同余+组合计数 CodeForces - 1056B]

    A - Stas and the Queue at the Buffet CodeForces - 1151D 题目大意:就是给你n个人在排队,每个人都有一个ai值和bi值,每个人的不满意度就是f(i ...

  5. Codeforces 1093C (思维+贪心)

    题面 传送门 题目大意: 有一个长n(n为偶数)的序列a 已知a满足 \(a_1≤a_2≤⋯≤a_n\) 给出一个长度为\(\frac{n}{2}\) 的序列b,定义\(b_i=a_i+a_{n-i+ ...

  6. codeforces#236_div2_A nuts 贪心

    题目地址:cf#236_div2_A 题目大意: 给你四个数 k,a,b,v;      k代表每个隔间最多不能超过的数目  ,a是果子个数,b是有多少隔板数量,v是一个隔板最多能装多少 现在问你,要 ...

  7. CodeForces - 888G Xor-MST(贪心+字典树+最小生成树)

    题目链接:点击查看 题目大意:给出 nnn 个点,任意两个点之间的边权为 ai⊕aja_i\oplus a_jai​⊕aj​,求最小生成树 题目分析:去年多校写过一样的模型,再拿出来写一遍回顾一下:牛 ...

  8. CodeForces - 1252E Songwriter(贪心)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列 a ,现在需要构造出一个长度为 n 的序列 b ,满足相邻的 i 和 i + 1 下,a[ i ] 和 a[ i + 1 ] 的大小关系应该和 ...

  9. CodeForces - 1368E Ski Accidents(拓扑排序)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的有向无环图,规定:每个点的出度一定小于等于 2 ,现在要求删除掉至多  个点,使得任意一条路径的长度都不大于 1 题目分析:主要是这个 ...

最新文章

  1. 数据库事务的四大特性和隔离级别
  2. 字符串阵列分别输出元素的索引,原值和长度
  3. JAVA获取当前系统时间System.currentTimeMillis()
  4. ios 应用 开发流程。。。
  5. 【PS】WBS结算到建工程问题
  6. 父类div高度适应子类div
  7. schoolcms - 学习笔记
  8. Excel生成Sql语句 格式如:=字符串1A2字符串2C2字符串3
  9. 几个清华和北邮学霸公众号,值得学习
  10. AWS redshift-hdb pg(Greenplum), 内置函数、数据类型、字符集
  11. OpenDaylight你不可不知的十大问题——OpenDaylight是什么?
  12. mac中的echo颜色输出
  13. 蓝桥杯 杨辉三角形 python组省赛真题
  14. pwm 正弦波_谈谈逆变器输出的方波与正弦波
  15. 步步惊心插曲 - 歌词
  16. 七夕表白代码(动画爱心)
  17. dede标签调用大全
  18. 滴滴、京东、今日头条等名企招人了,保密推荐,提前拿offer,可过年后入职!
  19. 阿里云免费SSL证书申请详细流程
  20. Android 操作系统的进程回收机制

热门文章

  1. php 检测密码,php 密码强度检测代码
  2. synchronized的用法
  3. 通道Channel-使用NIO 写入数据
  4. mybatis-批量更新
  5. 微信支付 - 提供支付中心商户订单查询
  6. JUL执行原理和流程
  7. 字符串-拆分和拼接字符串
  8. Oracle之垂直水平分库分表(二)
  9. qt 运行库 linux,linux(ubuntu) 版qt5.x安装的一些知识
  10. C#中所有对象共同的基类是System.Object