算法设计-贪心法
LYoGa
这个作者很懒,什么都没留下…
展开
-
UVA11714 - Blind Sorting(推理)
题目链接题意:给出n个数,求出得到最大数和第二大数所用的最多的比较次数思路:可以取两个数两两做比较,就相当与建立二叉树,两个数的最大值就相当与两个的父节点,所以我们我们可以知道得到最大值时的比较次数为n-1,然后假设所有左儿子都大于右儿子,所以最大值的右儿子还有跟左子树中的值做比较得到第二大数,比较的个数为树高。代码:#include #include原创 2014-08-17 21:27:35 · 795 阅读 · 0 评论 -
UVA1344 - Tian Ji -- The Horse Racing
题意:田忌赛马,求出能赢的最大的钱数思路:#include #include #include #include using namespace std;const int N = 1005;int a[N], b[N];int main() { int n; while (scanf("%d", &n) && n) { for原创 2014-04-14 16:51:38 · 593 阅读 · 0 评论 -
UVA11389-The Bus Driver Problem
题目链接题意:n个司机,n个下午路线和n个夜间的行驶时间。每个司机恰好分配到一个下午路线和一个夜间路线。司机行驶如果超过规定的行驶总时间,每个单位时间要多付给司机r元,求最小要给所有司机的加班费。思路:贪心,将两个时间段的行驶时间排序,然后依次取最大和最小相加减去规定时间。那么超过的时间将最小,加班费也会最小。 #include #include #include #原创 2014-08-10 21:08:57 · 1037 阅读 · 0 评论 -
UVA1368- DNA Consensus String
题意:给定m个长度均为n的DNA序列,求一个DNA序列,使其到所有序列的总Hamming距离尽量小。两个等长字符串的Hamming距离等于字符不同的位置个数。求字典序最小的解。思路:我们可以依次枚举每一个位置上的字母,要使得总的Hamming最小,那么每个位置上要取相同个数最多的那个字母,相同的话要取字典序最小的那个。#include #include #include原创 2014-08-08 09:36:39 · 1321 阅读 · 0 评论 -
UVA10905 - Children's Game
题目链接 题意:给ding原创 2014-08-08 21:02:37 · 602 阅读 · 0 评论 -
UVA10382- Watering Grass(区间覆盖问题)
题意:一块长l,宽w的长方形草坪,在其中心线的不同位置处装有n个点状的喷水装置。每个喷水装置i可将以它为中心,半径为ri的圆形区域润湿。请选择尽量少的喷水装置,把整个草坪全部润湿。思路:变形的区间覆盖问题。其实我们只要将圆形转化为覆盖在草坪上的矩形即可。当半径ri#include #include #include #include #include using原创 2014-08-08 09:46:40 · 861 阅读 · 0 评论 -
UVA1339- Ancient Cipher
题意:给定两个长度均为n的字符串,判断它们之间的26个字母能否一一对应,即做一个一一映射后使得两个字符串相同。输入两个字符串,输出YES或者NO。思路:只要判断出现的字母的次数能否完全一一对应即可,比如s1存在出现3次的字符,那么s2中也必须存在这样的字符。#include #include #include #include using namespace st原创 2014-08-08 09:30:46 · 1158 阅读 · 0 评论 -
UVA11039- Building designing
题意:有n个绝对值各不相同的非0整数,选出尽量多的数,排成一个序列,使得正负号交替,且绝对值递增。输出最长序列长度。思路:其实按照绝对值排序后,只要选出正负号交替最长的序列就可以了。用一个标记来表示下一个要选的是正号还是负号。#include #include #include #include #include using namespace std;co原创 2014-08-06 21:33:10 · 814 阅读 · 0 评论 -
UVA1335-- Beijing Guards
题意:有n个人围成一个圈,其中第i个人想要ri个不同的礼物。求最少需要多少种礼物,使得相邻的人的礼物都不相同。思路:这是大白上面的一道贪心题目。想法挺好的。首先如果n为偶数时,只要找出相邻两个人的r值最大,就是所需的最少的礼物数量。如果为奇数时,那情况就不一样了,因为当第1个和第n个都是奇数,按照上面的方法,他们的礼物种类是一样的,就不符合题意。那么我们可以按照第一个人所需要的礼物原创 2014-08-06 16:52:06 · 1137 阅读 · 0 评论 -
UVA11636- Hello World!
题意:使用最小的复制/黏贴次数,使得语句的条数恰好为n思路:贪心思想,因为复制是所有条数翻倍,所以每次都取最大的条数*2PS:天真的认为是n = -1时退出,所以WA了好几次。#include #include #include #include using namespace std;int main() { int n, t = 1;原创 2014-08-06 20:49:58 · 1369 阅读 · 0 评论 -
UVA714- Copying Books(最大值最小化)
题意:k份书稿分成m份,使得每份的和最小思路:典型最大值最小化问题,使用贪心+二分。贪心的是每次尽量将元素往右边划分,二分查找最小的x满足m个连续的子序列和S(i)都不超过x。因为输出的原因,在划分时就从后往前尽量划分。#include #include #include #include using namespace std;typedef long原创 2014-07-31 10:30:57 · 844 阅读 · 0 评论 -
UVA11100- The Trip, 2007
题目链接题意:给定n个正整数,把它们划分成尽量少的严格递增序列(前一个数必须小于后一个数),输出序列个数的最小值k和这k个序列。思路:出现次数最多的个数就是序列的个数。输出比较麻烦,但我们只要每k个数输出一个数字,那么最后就可以将所有序列都输出来了。#include #include #include #include usin原创 2014-08-10 20:20:49 · 775 阅读 · 0 评论 -
UVA1420 - Priest John's Busiest Day
题目链接题意:牧师John能否安排到所有婚礼,使其为所有婚礼送上祝福(祝福时间大于婚礼从时间的一半)。思路:贪心,按照婚礼中间时间从小到大排序,尽量早结束婚礼祝福时间最晚开始(每个婚礼都有一个祝福时间最晚开始的时间)比较早的婚礼。代码:#include #include #include #include using namespace std;原创 2014-08-17 16:32:18 · 836 阅读 · 0 评论 -
UVA434 - Matty's Blocks
题目链接题意:给出n,代表所要用积木搭建的整体的底面积的边长,然后分别给出正视图和右视图,要你求出搭建都要形状的最小木块数量和最小木块数量和最大木块数量的差值。思路:其实题目就是要你求出最小木块数和最大木块数,我们可以分开求解。 首先对于最小木块数,要想用最少的立方体搭建,那就意味着正视图中的每一竖立方体的高度最好都要被右视图中的高度所利用到。所以我们以正视图为基准原创 2014-08-13 23:04:48 · 759 阅读 · 0 评论 -
HDU4950-Monster
点击打开链接原创 2014-08-14 19:21:02 · 631 阅读 · 0 评论 -
UVA1555-- Garland(推导+二分)
题目链接题意:有n个灯,给定第一盏灯A的高度,接下去每盏灯的高度按照公式计算,求使所有灯都不会落在地上(允许碰触)的B的最低高度。思路:根据题目所给公式Hi=(Hj+1+Hj−1)/2−1,转化为Hi+1=2∗Hi−Hi−1+2,当我们已知H1时,我们就可以二分枚举H2,求出符合题意的最小的B#include #include #includ原创 2014-08-13 20:10:15 · 800 阅读 · 0 评论 -
UVA1153-Keep the Customer Satisfied(贪心+优先队列)
题目链接题意:有一家大型的钢铁厂,每月初都收到大量客户的订单,订单包括定制的钢铁的数量q,以及交货的截止时间d。每个单位时间只能完成一个订单的工作,不能同时进行多个,要求怎么安排使得接受的订单最多。思路:要使得订单最多,首先我们先按照截止日期,从小到大排序。 当qi>qj 并且 didj时,那么我们应该优先选择订单j才能使结果最优,所以我们使用优先队列来维护q值。原创 2014-08-13 15:39:44 · 1650 阅读 · 0 评论 -
UVA1445-Cubist Artwork
题目链接题意:用一些等大的立方体搭积木,每个立方体或者直接放在地面的网格上,或者放在另一个立方体的上面,给出正视图和侧视图,求出最少用多少个立方体搭建。思路:要想用最少的立方体搭建,那就意味着正面所看到的每一竖立方体的高度wh最好都要被侧面看到的高度dh所利用到。所以我们以正面为基准,正面需要的立方体总数加上侧面存在dh无法利用正面wh的数量,就是最少需要的立方体数。原创 2014-08-11 14:09:00 · 1156 阅读 · 0 评论 -
UVA1467 - Installations
题目链接题意:有n个服务,每个服务都有安装时间s,截止时间d。如果任务没有在截止时间之前完成,会有惩罚值,假设完成时间为C,则惩罚值为max(C-d,0)。求最两个最大惩罚值之和的最小值。思路:我们先按照截止时间d从小到大排序,如果d相同,则s小的排前面。这样处理得到的总的惩罚值是较优解,但不是最优解。排序之后,找到序列中惩罚值最大值和第二大值的两者中比较靠后的位置p,原创 2014-08-11 18:31:04 · 774 阅读 · 0 评论 -
UVA1316- Supermarket
点击打开链接题意:有N个物品,每个物品在都有一个截止日期,如果在截止日期之前(包括截止日期)卖出将会获得相应的利润,卖出物品需要一个单位时间,问最多能获得多少利润?思路:将利润从大到小排序,尽量在该物单位时间出售利润大的物品,这样就能使得从利润达到最大。#include #include #include #include using namespace原创 2014-08-12 11:29:01 · 822 阅读 · 0 评论 -
UVA1418-WonderTeam(推理+贪心)
题目链接题意:有n支队伍比赛,每两支队伍打两场(主客场各一次),胜得3分,输不得分,平得1分。比赛结束之后会评选出一个梦之队,它满足如下条件:进球总数最多(不能并列),胜利场数最多(不能并列),丢球总数最少(不能并列)。求梦之队的最低可能排名。一支得分为p的球队的排名等于等分严格大于p的球队的个数加1.思路:其实3个限定条件只有胜利场数最多有用,因为梦之队可以在胜利场次原创 2014-08-11 10:56:40 · 1014 阅读 · 0 评论 -
UVA1267 - Network
题意:n台及其连成一个树状网络,其中叶结点是客户端,其他结点是服务器。已经有一台服务器提供VOD服务,要求出最少在几个记得点放置服务器,使得所有客户端到服务器的距离都不超过k。思路:先将无根树状化为有根树。之后就利用贪心,找到深度最大的结点u,每次放置服务器的地方都要放在u的k级祖先,这样是最划算的。#include #include #include #includ原创 2014-08-06 10:34:07 · 866 阅读 · 0 评论 -
UVA10148- Advertisement(区间选点)
题意:一段路上,给出n个慢跑者跑步的区间,给出k,要求让每个慢跑者都能看到k个广告,区间都是整数操作,也就是说一个广告只能放在一个整数上,求最小贴的广告数思路:关于区间选点的问题。把所有区间按B从小到大排序(B相同时A从大到小排序),则如果出现区间包含的情况,小区间一定排在前面。所以贪心的策略就是,从后往前取k个点。因为只有从后面开始取点,满足的区间才最会最多,这样就能达到使用最少的点原创 2014-08-01 20:21:56 · 970 阅读 · 0 评论 -
UVA10041 - Vito's family
思路:要使一组数中,其中一个数跟其他数的差的绝对值的和最小,那个数就是中位数#include #include #include #include #include #define N 505using namespace std;int arr[N];int main() { int cas; scanf("%d", &cas); while (原创 2013-12-17 20:37:49 · 726 阅读 · 0 评论 -
UVA10670-Work Reduction
题意:老板给你工作范围,然后你不可能全部都独自完成,之后有公司帮你做工作,包括完成工作的一半需要的代价,和完成一件工作的代价,计算出雇佣每个公司所花费的代价,按升序排列。思路:贪心,每次选择最节省的办法。不过要注意这句话的意思(rounding down when necessary). 完成一半的要四舍五入#include #include #include #inc原创 2013-12-17 20:34:36 · 654 阅读 · 0 评论 -
UVA507-Jill Rides Again
思路:有关最大连续和的问题,一开始直接用两个for求出最大连续和,果断超时了,之后看了大神的思路,直接将时间复杂度降到O(n),就是记录i点到初始点的距离。假设你要求i点到j点的距离,只要用a[j] - a[i]就行了,不过要注意题目要求当连续最大和相等时,长度越长越好#include #include #include #define N 20005using name原创 2013-12-17 20:46:43 · 626 阅读 · 0 评论 -
UVA11054
题意:小镇上的居民,不外乎卖酒与买酒,但需要计算路程费用,要求计算出最小路程费用,使得居民都能进行买卖思路:贪心,小镇的居民都是相邻的,假设有5个居民,如样例,分别为5,-4,1,-3,1,其实我们可以只考虑相邻间的买卖,比如第一个需要5个,他可以完全向第二个买5个,虽然第二个只卖4个,但是可以算成第一个需要的5全向第二个买,变成满足了第一个的需求,第二个欠1,也就是-1,以此类推,所得到的费原创 2013-12-05 21:01:04 · 934 阅读 · 0 评论 -
UVA10020- Minimal coverage
思路:贪心,关于区间最小问题,先将区间排序 ,然后不断更新start的值。#include #include #include #define N 100005using namespace std;struct node { int x, y;}a[N], b[N];int cmp(node a, node b){ return a.原创 2013-12-05 20:28:50 · 722 阅读 · 0 评论 -
UVA993
题意:输入一个自然数m,之后找出一个自然数q,使得这个数各个位上的数字之和等于输入的自然数思路:搜索,就从9开始一直到2,是否能被输入的数整n除,可以的话,不断更新m的数值,贪心思想;不过要特判m=1的情况#include #include #include #include #define N 100000using namespace std;int arr[N];原创 2013-12-09 21:03:55 · 641 阅读 · 0 评论 -
UVA10714
题意:蚂蚁爬竿,问所有蚂蚁都从杆上 掉下去的最短和最长时间思路:根据题意,每只蚂蚁爬行速度一样,所以当蚂蚁碰头转向时,可以当作那两只蚂蚁还是按照原来的方向向前前进,用一个数组记录每只蚂蚁掉出杆的最短时间,另一个数组记录掉出杆的最长时间#include #include #include #include #include #define N 1000005using names原创 2013-11-26 20:38:27 · 730 阅读 · 0 评论 -
UVA10954
题意:求出一数组相加的和,但要求相加时产生的数的总和最小,可以看下题目给出的1,2,3 的样例思路:贪心,每次都取出数组最小的两个数进行相加,再把得到的数返回到数组中,直到相加结束,刚一开始做,在相加完的数组,直接用sort重新排序,结果就是超时了。。。。。。之后就重写了排序的函数,过了。。。#include #include #include #include #define N原创 2013-11-26 19:59:32 · 1011 阅读 · 0 评论 -
UVA311
这题是看别人的思路的。。。。备注:题目大意:有1*1,2*2,3*3,4*4,5*5,6*6大小的盒子,要把它们装到6*6的盒子里,它们的高度都是相同的。求用最少的6*6盒子把所有尺寸的盒子都装起来。分析与总结:这一题是我在Volume 4. Algorithm Design这个专题中最后才做的一题,主要是因为没有思路。最好还是参考了别人的思路。6*6的盒子中可以由各种尺寸原创 2013-11-24 15:53:08 · 756 阅读 · 0 评论 -
HDU1009
思路:贪心#include #include #include #include using namespace std;const int N = 1005;struct state{ double a, b, c;}s[N];bool cmp(const state& a, const state& b) { return a.c > b.原创 2014-04-14 16:45:25 · 579 阅读 · 0 评论 -
HDU1050
#include #include #include #include using namespace std;const int N = 205;int vis[N];int main() { int cas; int time; scanf("%d", &cas); while (cas--) { int n;原创 2014-04-14 16:49:19 · 610 阅读 · 0 评论 -
UVA108 - Maximum Sum(最大连续和)
题意:从一个n*n的矩阵中找出和最大的子矩阵思路:最大连续和的求解。我们可以将二维的转化为一维进行计算。sum[i][j]表示以(1, 1)和(i, j)为对角的矩阵的和。之后只要逐个枚举每个可能出现的值,保存最大值即可。#include #include #include #include using namespace std;const int INF原创 2014-08-01 20:15:46 · 892 阅读 · 0 评论 -
UVA10716 - Evil Straw Warts Live
题意:如果可以的话,使用最少的交换次数,使得字符串变成回文字符串。思路:首先我们可以先判断这个字符串是否有成为回文的可能性。当一个字符串中出现两个或两个以上的奇数个数的字符,那么这个字符串一定不能成为回文字符串。之后就要讨论怎么使用最少的交换次数使得变成回文字符串。我们可以采取由外到内的方法,即先将头尾两端的字符交换成相同的,然后left++,right--,慢慢向内靠拢。为了原创 2014-08-01 20:09:39 · 840 阅读 · 0 评论 -
UVA10720- Graph Construction
题意:给出一些点的度数,问使用所有点是否能形成图思路:使用了Havel-Hakimi定理。详细的定理解释借鉴学长的一篇博客 Havel-Hakimi定理#include #include #include #include using namespace std;const int MAXN = 10005;int n, arr[MAXN];i原创 2014-08-01 19:47:36 · 825 阅读 · 0 评论 -
HDU4882-ZCC Loves Codefires
题意:依次给出每题解出的时间,以及原创 2014-07-25 09:28:02 · 593 阅读 · 0 评论 -
HDU2187
还是贪心排序原创 2014-04-22 21:19:07 · 594 阅读 · 0 评论 -
HDU2111
贪心排序#include #include #include using namespace std;const int N = 105;int v, n, sum;struct bag{ int pi, mi;}b[N];bool cmp(const bag& a, const bag& b) { return a.pi > b.pi;}原创 2014-04-22 21:17:09 · 755 阅读 · 0 评论