这道题看起来就是个裸的拓扑排序,抄上模板就能AC。

上面这种想法一看就不现实,然鹅我第一次还真就这么写了,然后被随意hack。


我们需要注意一句话:

现在,酒店希望能求出一个最优的菜肴的制作顺序,使得小 A能尽量先吃到质量高的菜肴:

这句话什么意思呢?

看上去它是说想要一个字典序最小的排列,但我们可以发现,题目并不是强求质量高一定先,而是有一个宽限范围(可能我讲的比较玄学)。

解决方案是贪心地把大的放在末尾,那么最后一定是最优解。

所以我们跑一个字典序最大的拓扑就可以了。

字典序最大就是反着跑一遍字典序最小。


AC代码如下:

820ms 133668kb

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. namespace StandardIO {
  6.  
  7. template<typename T>inline void read (T &x) {
  8. x=;T f=;char c=getchar();
  9. for (; c<''||c>''; c=getchar()) if (c=='-') f=-;
  10. for (; c>=''&&c<=''; c=getchar()) x=x*+c-'';
  11. x*=f;
  12. }
  13.  
  14. template<typename T>inline void write (T x) {
  15. if (x<) putchar('-'),x*=-;
  16. if (x>=) write(x/);
  17. putchar(x%+'');
  18. }
  19.  
  20. }
  21.  
  22. using namespace StandardIO;
  23.  
  24. namespace Solve {
  25.  
  26. const int N=;
  27.  
  28. int T,n,m,cnt;
  29. int indeg[N],ans[N];
  30. vector<int>graph[N];
  31.  
  32. inline void toposort () {
  33. int temp[N];
  34. priority_queue<int>q;
  35. memcpy(temp,indeg,sizeof(indeg));
  36. while(!q.empty())q.pop();
  37. for (register int i=; i<=n; ++i) {
  38. if (temp[i]==) q.push(i);
  39. }
  40. while (!q.empty()) {
  41. int v=q.top();q.pop();
  42. ans[++cnt]=v;
  43. for (register int i=; i<graph[v].size(); ++i) {
  44. int to=graph[v][i];
  45. temp[to]--;
  46. if (temp[to]==) q.push(to);
  47. }
  48. }
  49. }
  50.  
  51. inline void solve () {
  52. read(T);
  53. while (T--) {
  54. read(n),read(m);
  55. cnt=,memset(indeg,,sizeof(indeg));
  56. for (register int i=; i<=n; ++i) {
  57. graph[i].clear();
  58. }
  59. for (register int i=; i<=m; ++i) {
  60. int x,y;
  61. read(x),read(y);
  62. indeg[x]++;
  63. graph[y].push_back(x);
  64. }
  65. toposort();
  66. if (cnt!=n) puts("Impossible!");
  67. else {
  68. for (register int i=n; i>=; --i) write(ans[i]),putchar(' ');
  69. putchar('\n');
  70. }
  71. }
  72.  
  73. }
  74. }
  75.  
  76. using namespace Solve;
  77.  
  78. int main () {
  79. // freopen(".in","r",stdin);
  80. // freopen(".out","w",stdout);
  81. solve();
  82. }

题解 P3243 【[HNOI2015]菜肴制作】的更多相关文章

  1. P3243 [HNOI2015]菜肴制作(拓扑排序)

    P3243 [HNOI2015]菜肴制作 题目误导你正着做拓扑排序,然鹅你可以手造数据推翻它.于是就只能倒着做 我们开个优先队列,每次把可填的最大的编号取出来搞,最后倒着输出拓扑序就好辣 #inclu ...

  2. 【题解】[HNOI2015]菜肴制作(贪心+topo序)

    [题解][HNOI2015]菜肴制作(贪心+topo序) 题意:请你构造一个排列\(p[i]\)使得对于数组\(arc[i]=p[i]\)的字典序最小,并且对于给定的有序数对\((u,v)\)保证你给 ...

  3. 【题解】 [HNOI2015]菜肴制作 (拓扑排序)

    题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1. 由于菜肴 ...

  4. 洛谷 P3243 [HNOI2015]菜肴制作 题解

    每日一题 day60 打卡 Analysis 这道题一看就感觉是个拓扑排序,但因为按字典序最小的排序会有问题(见第三个样例)主要原因是每次选择有后效性,而从后往前就不会存在这个问题,因为每个子任务都是 ...

  5. P3243 [HNOI2015]菜肴制作

    传送门 把时间看成数,菜肴看成位置 考虑一个位置填什么数很麻烦 考虑一个数放在什么位置 一开始我想的是,对于一个限制 $(a,b)$ ,从 $a$ 往 $b$ 连一条边,然后如果有解则所有的限制构成了 ...

  6. 洛谷P3243 [HNOI2015]菜肴制作——拓扑排序

    题目:https://www.luogu.org/problemnew/show/P3243 正向按字典序拓扑排序很容易发现是不对的,因为并不是序号小的一定先做: 但若让序号大的尽可能放在后面,则不会 ...

  7. luogu P3243 [HNOI2015]菜肴制作

    这题一看就知道和拓扑序有关 考虑拓扑排序的时候每次取队列里最小的数进行排序 然后就\(\mathcal{GG}\)了,因为这样只能使字典序最小,而并不能保证题目中要求的每个编号的数要在满足前面数尽量在 ...

  8. 洛谷P3243 [HNOI2015]菜肴制作 拓扑排序+贪心

    正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5, ...

  9. Making Dishes (P3243 [HNOI2015]菜肴制作)

    Background\text{Background}Background I've got that Luogu Dialy has been \text{I've got that Luogu D ...

  10. 洛谷P3243 [HNOI2015]菜肴制作 (拓扑排序/贪心)

    这道题的贪心思路可真是很难证明啊...... 对于<i,j>的限制(i必须在j之前),容易想到topsort,每次在入度为0的点中选取最小的.但这种正向找是错误的,题目要求的是小的节点尽量 ...

随机推荐

  1. 【原创】如何使用一句SQL计算工作日天数?

    现在有这样一个需求,要求计算两个日期间的工作日天数,要求除去节假日,其中节假日有一张配置表,具体的格式如下: 开始日期 结束日期 节假日类型 节假日名称 2013-08-10 2013-08-12   ...

  2. 路飞学城-Python开发-第一章

    # 基础需求: # 让用户输入用户名密码 # 认证成功后显示欢迎信息 # 输错三次后退出程序 username = 'pandaboy' password = ' def Login(username ...

  3. es6 学习7 Set 和 Map 数据结构

     Set 和 Map 数据结构 一.Set ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. const set = new Set([1, 2, 3, 4, ...

  4. axios使用方法

    npm install axios 创建文件夹api/index.js import axios from 'axios'; let http = axios.create({ baseURL: '' ...

  5. caioj 1114 树形动态规划(TreeDP)3.0:多叉苹果树【scy改编ural1018二叉苹果树】

    一波树上背包秒杀-- #include<cstdio> #include<cstring> #include<algorithm> #include<vect ...

  6. Mysql学习总结(25)——MySQL外连接查询

    1.左外连接left outer join或者left jion,outer可以省略不写,下边的右连接和全连接也一样: 左外连接的意思是,以left join左边的表中的数据为基准,即左边的表中有的必 ...

  7. mysql中的锁表语句查看方法汇总

    mysql> show status like 'Table%'; +----------------------------+----------+ | Variable_name | Val ...

  8. Java中的字符串常量池和JVM运行时数据区的相关概念

    什么是字符串常量池 JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池 工作原理 当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量 ...

  9. 蓝牙压力測试报抛android.os.TransactionTooLargeException异常分析总结

    1.从main日志中找到异常点,例如以下: 08-20 11:05:19.754 5023 5023 E AndroidRuntime: FATAL EXCEPTION: main 08-20 11: ...

  10. 工作笔记5.JAVA图片验证码

    本文主要内容为:利用JAVA图片制作验证码. 设计思路: 1.拷贝AuthImageServlet.class图片验证码 2.配置web.xml 3.JSP中,调用封装好的AuthImageServl ...