随笔分类 - ACM_贪心
摘要:题目链接:http://acm.hdu.edu.cn/userstatus.php?user=zhsl 题意:给两个大数,他们之间的加法法则每位相加不进位。现在可以对两个大数的每位重新排序,但是首位不能为0,求两个数相加最大的和。 从最高位开始,考虑和最大贪心,每次从两个大数中找两位a和b,max=(a+b)%10的和最大。如果max有多种组成情况,对于a+b10的组合情况,如果有a+b10的组合情况。。 1 //STATUS:C++_AC_453MS_2260KB 2 #include 3 #include 4 #include 5 //#include 6 #i...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26476 题意:给一个字符序列,比如MWMMW,每次可以取前面两个中的一个,取出来后,取出来的那个个数加一,要求使得两个字符的个数不超过n,求最多能取多少个。。 贪心就可以了。 1 //STATUS:C++_AC_36MS_1480KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4647 注意这题两人的决策是想要使得自己的分数与对方的差值最大。。 注意到数据范围,显然是贪心之类的,如果没有变那么很简单,如果有边,那么我们进行拆边,把边的权值的一半加到所连的点上。然后排个序贪心。。 1 //STATUS:C++_AC_218MS_1020KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #in...
阅读全文
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3721 容易的贪心题,排个序。。 1 //STATUS:C++_AC_840MS_6272KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #includ...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4415 用贪心来解,开始分为两个集合的方法错了,没有考虑之间的相互影响,正确的姿势应该是这样的,分两种情况考虑: 1.只考虑Bi全为0的集合,排个序,能取多少就取多少。 2.如果Bi不为0的集合中的Ai的最小值low如果大于m,那么就到了 1 的情况。否则两个集合放在一起排个序,Bi不为0的集合中至少选取low,刀的总数为sum,那么除去排序后sum个Ai值大的敌人,然后还剩下m-low个durability。用这m-low去消灭剩下的集合。 1 //STATUS:C++_AC_...
阅读全文
摘要:题目链接:http://poj.org/problem?id=2287 题目很容易误以为是最大匹配,不过O( n^3 )的复杂度承受不了,必须用贪心或者DP策略了。 容易想到先排序,然后贪心,贪心策略如下: 1.如果田忌最慢的马比齐王最慢的马快,那么赢一局。 2.如果田忌最慢的马比齐王最慢的马慢,那么拿田忌最慢的马浪费掉齐王最快的马,输一局。 3.如果田忌最慢的马和齐王最慢的马一样快: (1)如果田忌最快的马比齐王最快的马快,那么赢一局。 (2)如果田忌最快的马比齐王最慢的马慢,那么拿田忌最慢的马浪费掉齐王最快的马,输一局。 (3)如果田...
阅读全文
摘要:题目链接:http://poj.org/problem?id=3253 题目大意是,把一块长木板割成n快给定长度的木板,每次的花费为当前模板的长度,求最小的花费。逆向求解即可,贪心的思想,每次取两块木板长度最小的,花费为量长度之和,然后把新的长度加进去,操作n-1次,就是一个huffman树的构造过程。然后用优先队列搞之。 1 //STATUS:C++_AC_16MS_348KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3998 题目大意是:给你一个数列,要你求最长的上升子序列,并且求最多有几个,且每个数只能在每个子序列中出现一次。对于第一问题很容易用DP解决,那么第二个问题,如果每个数可以出现多次的话,DP也很容易解决,但这里必须只能出现一次,否则的话就得判重,复杂度O(n3)。把问题简化一下,就是求长度为s的点不想交的路径有多少条,即每个点的容量为1(拆点),dp值相差为1的建立边,增加源汇点s、t,s向dp值为1的建立边,dp值最大的向t建立边,然后求最大流。 在网上看到这题贪心也可以搞,具体做法就是从...
阅读全文