题解 P3243 【[HNOI2015]菜肴制作】
这道题看起来就是个裸的拓扑排序,抄上模板就能AC。
上面这种想法一看就不现实,然鹅我第一次还真就这么写了,然后被随意hack。
我们需要注意一句话:
现在,酒店希望能求出一个最优的菜肴的制作顺序,使得小 A能尽量先吃到质量高的菜肴:
这句话什么意思呢?
看上去它是说想要一个字典序最小的排列,但我们可以发现,题目并不是强求质量高一定先,而是有一个宽限范围(可能我讲的比较玄学)。
解决方案是贪心地把大的放在末尾,那么最后一定是最优解。
所以我们跑一个字典序最大的拓扑就可以了。
字典序最大就是反着跑一遍字典序最小。
AC代码如下:
820ms 133668kb
#include<bits/stdc++.h>
using namespace std;
namespace StandardIO {
template<typename T>inline void read (T &x) {
x=;T f=;char c=getchar();
for (; c<''||c>''; c=getchar()) if (c=='-') f=-;
for (; c>=''&&c<=''; c=getchar()) x=x*+c-'';
x*=f;
}
template<typename T>inline void write (T x) {
if (x<) putchar('-'),x*=-;
if (x>=) write(x/);
putchar(x%+'');
}
}
using namespace StandardIO;
namespace Solve {
const int N=;
int T,n,m,cnt;
int indeg[N],ans[N];
vector<int>graph[N];
inline void toposort () {
int temp[N];
priority_queue<int>q;
memcpy(temp,indeg,sizeof(indeg));
while(!q.empty())q.pop();
for (register int i=; i<=n; ++i) {
if (temp[i]==) q.push(i);
}
while (!q.empty()) {
int v=q.top();q.pop();
ans[++cnt]=v;
for (register int i=; i<graph[v].size(); ++i) {
int to=graph[v][i];
temp[to]--;
if (temp[to]==) q.push(to);
}
}
}
inline void solve () {
read(T);
while (T--) {
read(n),read(m);
cnt=,memset(indeg,,sizeof(indeg));
for (register int i=; i<=n; ++i) {
graph[i].clear();
}
for (register int i=; i<=m; ++i) {
int x,y;
read(x),read(y);
indeg[x]++;
graph[y].push_back(x);
}
toposort();
if (cnt!=n) puts("Impossible!");
else {
for (register int i=n; i>=; --i) write(ans[i]),putchar(' ');
putchar('\n');
}
}
}
}
using namespace Solve;
int main () {
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
solve();
}
题解 P3243 【[HNOI2015]菜肴制作】的更多相关文章
- P3243 [HNOI2015]菜肴制作(拓扑排序)
P3243 [HNOI2015]菜肴制作 题目误导你正着做拓扑排序,然鹅你可以手造数据推翻它.于是就只能倒着做 我们开个优先队列,每次把可填的最大的编号取出来搞,最后倒着输出拓扑序就好辣 #inclu ...
- 【题解】[HNOI2015]菜肴制作(贪心+topo序)
[题解][HNOI2015]菜肴制作(贪心+topo序) 题意:请你构造一个排列\(p[i]\)使得对于数组\(arc[i]=p[i]\)的字典序最小,并且对于给定的有序数对\((u,v)\)保证你给 ...
- 【题解】 [HNOI2015]菜肴制作 (拓扑排序)
题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1. 由于菜肴 ...
- 洛谷 P3243 [HNOI2015]菜肴制作 题解
每日一题 day60 打卡 Analysis 这道题一看就感觉是个拓扑排序,但因为按字典序最小的排序会有问题(见第三个样例)主要原因是每次选择有后效性,而从后往前就不会存在这个问题,因为每个子任务都是 ...
- P3243 [HNOI2015]菜肴制作
传送门 把时间看成数,菜肴看成位置 考虑一个位置填什么数很麻烦 考虑一个数放在什么位置 一开始我想的是,对于一个限制 $(a,b)$ ,从 $a$ 往 $b$ 连一条边,然后如果有解则所有的限制构成了 ...
- 洛谷P3243 [HNOI2015]菜肴制作——拓扑排序
题目:https://www.luogu.org/problemnew/show/P3243 正向按字典序拓扑排序很容易发现是不对的,因为并不是序号小的一定先做: 但若让序号大的尽可能放在后面,则不会 ...
- luogu P3243 [HNOI2015]菜肴制作
这题一看就知道和拓扑序有关 考虑拓扑排序的时候每次取队列里最小的数进行排序 然后就\(\mathcal{GG}\)了,因为这样只能使字典序最小,而并不能保证题目中要求的每个编号的数要在满足前面数尽量在 ...
- 洛谷P3243 [HNOI2015]菜肴制作 拓扑排序+贪心
正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5, ...
- Making Dishes (P3243 [HNOI2015]菜肴制作)
Background\text{Background}Background I've got that Luogu Dialy has been \text{I've got that Luogu D ...
- 洛谷P3243 [HNOI2015]菜肴制作 (拓扑排序/贪心)
这道题的贪心思路可真是很难证明啊...... 对于<i,j>的限制(i必须在j之前),容易想到topsort,每次在入度为0的点中选取最小的.但这种正向找是错误的,题目要求的是小的节点尽量 ...
随机推荐
- Timer 的 schedule()方法
1.timer.schedule(new MyTask(),long time1,long time2); 第一个参数是TimerTask类,使用者要继承该类,并实现run()方法,因为TimerTa ...
- [转] CentOS 7 为firewalld添加开放端口及相关资料
转自http://www.cnblogs.com/hubing/p/6058932.html 1.运行.停止.禁用firewalld 启动:# systemctl start firewalld 查 ...
- shell-3.bash的基本功能: history tab alias 快捷键
- [LOJ2607]【NOIP2012】疫情控制
题意: 题目描述 H 国有n个城市,这n个城市用n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边 ...
- 【问题】解决python3不支持mysqldb
Django框架使用的还是python2.x的MySQLdb,而python3.x使用的是pymysql,centos7上默认安装的python2.7,自己安装了python3.6的版本,在运行dja ...
- pandas 1 基本介绍
import numpy as np import pandas as pd pd.Series() 构造数据 s = pd.Series([1, 3, 5, np.nan, 44, 1]) prin ...
- Mysql学习总结(22)——Mysql数据库中制作千万级测试表
前言: 为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张千万记录用户表. 步骤: 1 创建数据表(MYISAM方式存储插入速度比innodb方式快很多) 数据表描述 数 ...
- XML快速注释
eclipse中编辑java或C/C++,python文件时,注释的快捷键均为 "CTRL + / ",编辑xml文件时,该快捷键无效. eclipse XML 注释:CTRL + ...
- C#-反射知识点(转载)
反射的用途: (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例. (2)使用Module了解包含模块的程序集以及模块中的 ...
- Fedora 17 安裝完全指南
Fedora 17 关闭U盘自动mount gsettings set org.gnome.desktop.media-handling automount "false" gse ...