题意:

派会上有n种食物,每种食物有wi份。有m个朋友,每一个朋友有两种他喜欢吃的食物xi,yi。你需要判断他的朋友是否都能吃到食物。如果都能吃到食物,那么要输出朋友来的顺序,不能的话输出“DEAD”。

如果一个朋友来的时候发现两种他喜欢的食物都有,那么他会两种食物都吃一份,如果仅有一种食物还有,那么就只吃一份这种食物。

题解:

首先先预处理一下每一种食物有多少人要吃,我们设某种食物的需求量为needi份,如果某种食物的needi<=wi,那么只要喜欢第i种食物的人永远不可能没有食物吃。那么我们可以使用贪心策略,既然这些人什么时候都有吃的东西,那么我们就最后再通知他来派会,同时这些人对其他食物的需求我们可以消除掉,因为另一种食物有没有都不重要了。就一直这样判断看最后还有没有人没有加入到通知到派会,如果没有的话就输出“ALIVE”并输出序列

其次就是这道题的数据较大,所以暴力方法就不可行,我们就可以采用建图方式来解决问题,具体方法见代码

代码:

  1. 1 #include<stdio.h>
  2. 2 #include<algorithm>
  3. 3 #include<iostream>
  4. 4 #include<string>
  5. 5 #include<queue>
  6. 6 #include<string.h>
  7. 7 #include<map>
  8. 8 #include <iostream>
  9. 9 #include <math.h>
  10. 10 using namespace std;
  11. 11 typedef long long ll;
  12. 12 #define maxn 300005
  13. 13 #include<vector>
  14. 14 struct node
  15. 15 {
  16. 16 int id,x;
  17. 17 };
  18. 18 vector<node>e[maxn];
  19. 19 queue<int>q;
  20. 20 int d[maxn],w[maxn],ans[maxn],vis[maxn];
  21. 21 int main()
  22. 22 {
  23. 23 int n,m;
  24. 24 scanf("%d %d",&n,&m);
  25. 25 for(int i=1;i<=n;i++)
  26. 26 scanf("%d",&w[i]);
  27. 27 for(int i=1;i<=m;i++)
  28. 28 {
  29. 29 int x,y;
  30. 30 scanf("%d %d",&x,&y);
  31. 31 e[x].push_back({i,y});
  32. 32 e[y].push_back({i,x});
  33. 33 d[x]++;d[y]++;
  34. 34 }
  35. 35 for(int i=1;i<=n;i++)
  36. 36 {
  37. 37 if(d[i]<=w[i])
  38. 38 {
  39. 39 q.push(i);
  40. 40 }
  41. 41 }
  42. 42 int f=m;
  43. 43 while(!q.empty())
  44. 44 {
  45. 45 int i=q.front();
  46. 46 q.pop();
  47. 47 //printf("i=%d\n",i);
  48. 48 for(int k=0;k<e[i].size();++k)
  49. 49 {
  50. 50 node j=e[i][k];
  51. 51 if(vis[j.id]==1)
  52. 52 continue;
  53. 53 vis[j.id]=1;
  54. 54 d[j.x]--;
  55. 55 //printf("j.id=%d j.x=%d\n",j.id,j.x);
  56. 56 if(d[j.x]<=w[j.x]) q.push(j.x);
  57. 57 ans[f--]=j.id;
  58. 58
  59. 59 }
  60. 60 }
  61. 61 if(f)
  62. 62 {
  63. 63 printf("DEAD\n");
  64. 64 return 0;
  65. 65 }
  66. 66 printf("ALIVE\n");
  67. 67 for(int i=1;i<=m;i++)
  68. 68 {
  69. 69 printf("%d",ans[i]);
  70. 70 printf("%c",i==n?'\n':' ');
  71. 71 }
  72. 72 }

Codeforces Round #652 (Div. 2) E. DeadLee 贪心的更多相关文章

  1. Codeforces Round #652 (Div. 2) E. DeadLee(贪心)

    题目链接:https://codeforces.com/contest/1369/problem/E 题意 Lee 有 $n$ 种不同种类的食物和 $m$ 个朋友,每种食物有 $w_i$ 个,每个朋友 ...

  2. Codeforces Round #652 (Div. 2) C. RationalLee 贪心

    题意: t组输入,你有n个数,还有k个朋友,每一个朋友需要wi个数.意思就是你要给第i个朋友分配wi个数,输入保证w1+w2+...+wk=n 一个朋友的兴奋值是你分配给他的数中最大值加上最小值的和( ...

  3. Codeforces Round #652 (Div. 2) C. RationalLee(贪心)

    题目链接:https://codeforces.com/contest/1369/problem/C 题意 将 $n$ 个数分给 $k$ 个人,每个人分 $w_i$ 个数($\sum_{i = 1}^ ...

  4. Codeforces Round #202 (Div. 1) A. Mafia 贪心

    A. Mafia Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/348/problem/A D ...

  5. Codeforces Round #382 (Div. 2)B. Urbanization 贪心

    B. Urbanization 题目链接 http://codeforces.com/contest/735/problem/B 题面 Local authorities have heard a l ...

  6. Codeforces Round #164 (Div. 2) E. Playlist 贪心+概率dp

    题目链接: http://codeforces.com/problemset/problem/268/E E. Playlist time limit per test 1 secondmemory ...

  7. Codeforces Round #180 (Div. 2) B. Sail 贪心

    B. Sail 题目连接: http://www.codeforces.com/contest/298/problem/B Description The polar bears are going ...

  8. Codeforces Round #192 (Div. 1) A. Purification 贪心

    A. Purification Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/329/probl ...

  9. Codeforces Round #274 (Div. 1) A. Exams 贪心

    A. Exams Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/480/problem/A Des ...

随机推荐

  1. PAT甲级练习 1087 All Roads Lead to Rome (30分) 字符串hash + dijkstra

    题目分析: 这题我在写的时候在PTA提交能过但是在牛客网就WA了一个点,先写一下思路留个坑 这题的简单来说就是需要找一条最短路->最开心->点最少(平均幸福指数自然就高了),由于本题给出的 ...

  2. 【Vue】Vue框架常用知识点 Vue的模板语法、计算属性与侦听器、条件渲染、列表渲染、Class与Style绑定介绍与基本的用法

    Vue框架常用知识点 文章目录 Vue框架常用知识点 知识点解释 第一个vue应用 模板语法 计算属性与侦听器 条件渲染.列表渲染.Class与Style绑定 知识点解释 vue框架知识体系 [1]基 ...

  3. Mybatis 一级缓存和二级缓存的使用

    目录 Mybatis缓存 一级缓存 二级缓存 缓存原理 Mybatis缓存 官方文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache My ...

  4. UNDO表空间切换步骤

    1.新建UNDO表空间 create undo tablespace UNDOTBS2 datafile '/data01/testdb/undotbs01.dbf' size 1G; alter d ...

  5. ECharts图表——封装通用配置

    前言 前段时间在做大屏项目,大量用到echarts图表,大屏对设计规范要求比较高,而大屏项目,经常会因为业务方面的原因.或者是数据方面的原因改动UI设计,所有图表的代码也是三天一小改.五天一大改 因此 ...

  6. css animation @keyframes 动画

    需求:语音播放动态效果 方案:使用如下图片,利用 css animation @keyframes  做动画 html <span class="horn" :class=& ...

  7. OO第三次总结博客

    规格化设计的发展历史 (因为很难寻找,所以参考了下别的同学的调研结果) 规格化设计与结构化.模块化设计密不可分,伴随着OOP语言的发展,规格化设计思想逐渐形成体系,慢慢完善. 20世纪60年代,程序的 ...

  8. Navicat 创建mysql存过、定时执行存过

    创建存过: 使用Navicat for MySQL工具创建存储过程步骤: 1. 新建函数(选择函数标签 -> 点击新建函数): 2.输入函数的参数个数.参数名.参数类型等: 3.编写存储过程: ...

  9. Crypto.getRandomValues()

    Crypto.getRandomValues() - Web APIs | MDN https://developer.mozilla.org/en-US/docs/Web/API/Crypto/ge ...

  10. 僵尸网络(botnet)概念浅析

    僵尸程序 僵尸程序是用于构建僵尸网络以形成大规模攻击平台的恶意代码.僵尸网络是被黑客集中控制的计算机群,其核心特点是黑客能够通过一对多的命令与控制信道操纵感染僵尸程序的主机执行相同的恶意行为,如可同时 ...