POJ3687拓扑排序+贪心】的更多相关文章

题意:       给你n个求,他们的重量是1-n(并不是说1号求的重量是1...),然后给你m组关系a,b,表示a的重量小于b的重量,然后让你输出满足要求的前提下每个球的重量,要求字典序最小. 思路:       很容易想到这个可以用拓扑排序(其实如果没有字典序那个要求的话查分约束也行),还有就是这个里面的字典序最小不是说拓扑排序的字典序最小,这个要整清楚,如果是求拓扑排序的序列字典序最小直接在出队列的时候找一个编号最小的就行,但是这个不是,我们必须要逆向建边,然后逆向分配编号,因为正向的话会…
BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题, 某些菜肴必须在另一些菜肴之前制作,具体的,一共有 M 条形如“i 号菜肴‘必须’ 先于 j 号菜肴制作”的限制,我们将这样的限制简写为<i,j>.现在,酒店希望能求 出一个最优的菜肴的制作顺序,使…
题目是要给n个重量1到n的球编号,有一些约束条件:编号A的球重量要小于编号B的重量,最后就是要输出字典序最小的从1到n各个编号的球的重量. 正向拓扑排序,取最小编号给最小编号是不行的,不举出个例子真的很难理解= =比如这个数据: 1 4 2 4 1 3 2 正确答案是2 4 3 1,会得到的错误答案是4 2 1 3. 一开始我是用了贪心的做法,每次选未安排重量的最小的编号,安排给它尽量小的重量.某个编号能得到的最小的重量的计算是这样的: 计算出约束中重量要小于此编号的编号个数,记为k,这个可以先…
传送门 短代码简单题. 题意简述:对于一个序列XXX,定义其两个伴随序列a,ba,ba,b,aia_iai​表示以第iii个数结尾的最长上升子序列长度,bib_ibi​表示以第iii个数开头的最长下降子序列长度,现在给出aaa序列,问bbb序列所有数加起来最大值是多少. 思路:首先发现bbb序列就是把这个序列反过来之后得到的X′X'X′的aaa序列,因此贪心证明一波可以发现:对于这个需要自己构造的原序列是较大的数越靠前越好 然后可以根据aaa序列建一些有向边来表示各个位置的大小关系. 考虑证明如…
逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7736    Accepted Submission(s): 2248 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是…
题意 题目链接 Sol 非常妙的一道题. 首先不难想到拓扑排序,但是直接对原图按\(k\)从小到大拓扑排序是错的.因为当前的\(k\)大并不意味着后面的点\(k\)也大 但是在反图上按\(k\)从大到小拓扑排序就是对的.为什么呢?因为题目中给出的条件是下限, 而在反图上拓扑排序就相当于卡着下限做,因此一定是最优的 对于第二问,同样在反图上搞.对每个点分开做,贪心的策略是:如果有其他的飞机可以起飞则让他们起飞,直到没有飞机可以起飞,这时的时间就是答案 // luogu-judger-enable-…
<题面> 一个蒟蒻的痛苦一天 在今天的节目集训中,麦蒙将带领大家学习9种错误的解题策略 $15\%$算法(看两个就往下走吧) 1> puts("Impossible!"); 不解释(话说多测输出这个有分真是奇迹)(这个过不了样例了) 2>DFS无优化贪心法 随后,我想到,如果用dfs处理每一部分就可以将一些小的菜肴优先纳入考虑(样例也能过) 当然,这个也有错误,是贪心的目光短浅导致的,比如 1 5 4 4 1 5 1 3 4 2 5 会因为去搜了$4$而搜不到$…
正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5,1,2,3,4 但是上面这个想法的结果是2,3,4,5,1 那就想要不优化一下趴,按照能到达的点为第一关键字,自己点的编号为第二关键字排序呢 还是布星,,,<5,2><5,4><2,1><4,3><3,1> 正解应为5,2,1,4,3,但是上面这个想…
绝世好题啊.. 题意:给出一个DAG,和每个点要求出现在这个DAG里面的拓扑排序的位置<=ti,求出所有可能的拓扑排序里面每个点出现的位置的最小值. 正着做不好做,考虑反着做,建立这个图的反图. 对于一个点出现的位置的最小值,就是n-这个点在反图中出现的位置的最大值. 也就是说拓扑排序时尽量把这个点i排在后面就行了.但是还需要满足一个限制,在反图中这个限制就是每个点在拓扑排序的位置>=n-ti. 于是我们每次拓扑排序从队列中取出点的时候,尽量取n-ti值最小的点,这样就能尽量使得当前处理的点i…
这题不是求最小字典序...撕烤了半个小时才发现不对劲T T 这题是能让小的尽量前就尽量前,无论字典序...比如1能在2前面就一定要在2前面... 显然是要先拓扑排序,让小的尽量前转化成让大的尽量往后丢,这样实际上就跟字典序无关了.于是建反向图,用堆维护一下入度为0的最大值来弹出就好了. 以后拓扑排序别用for弹栈了T T WA了好久 #include<iostream> #include<cstring> #include<cstdlib> #include<cs…