2016专题训练1(二分、贪心)
文章平均质量分 61
金金金金鑫
这个作者很懒,什么都没留下…
展开
-
HDU 4811 Ball(超直白解释)
题意: 有三种颜色,给你每种颜色的球的数量,有以下两种得分方式,问你如何放置这些球,让总得分最大。 方式一:放第一个球的得分为0 方式二:放在最后面的得分为之前的所有球的颜色种数 方式三:放在中间的得分为左边球的颜色种数+右边球的颜色种数 思路: 找规律,推导出公式,因为只有三种颜色,如果每种颜色都有2的及以上,那么可以先在两边各摆三种颜色的球,这样每次把其他球放入中间时都能得到6分,原创 2016-07-15 10:50:39 · 1282 阅读 · 0 评论 -
UVA 12382 Grid of Lamps
题意: 有n行m列的灯泡,现给出每行每列至少需要点亮的灯泡数量,问实际最少需要点亮多少灯泡才能满足题意。 思路: 要使点亮的数量最少,那么我们需要使得共用的灯泡数量尽可能地多,对于每一列来说,每一行对它的贡献只有一个灯泡,那么我们现在可以从枚举每一列,让它去消除每一行的灯泡数量,即让他们共用灯泡,未能消除的就只能单独点亮。 #include #include using namespace原创 2016-07-18 10:12:53 · 478 阅读 · 0 评论 -
POJ 3614 Sunscreen
题意: n有c头牛晒太阳,每头牛都有一个能承受辐射的范围(min~max),现在有l 种防晒霜,每种防晒霜都能将辐射值固定在spf,每种防晒霜都有一定的数量num。每头牛用最多一种防晒霜,问能满足多少头牛。 思路: 贪心。先将每头牛按min值从小到大排序,将防晒霜按spf值从小到大排,然后枚举每种防赛霜,将所有符合min #include #include #include using原创 2016-07-17 13:22:41 · 232 阅读 · 0 评论 -
UVA 10954 Add All
题意: n给定n个数字,每次选出两个数字相加,花费代价为这次加法得到的和,然后在把这个和放回去,不断操作直到剩1个数字,问最小花费。 思路: 哈夫曼编码,每次选择数组中最小的两个数相加,这样所得花费会最小。这里用优先队列维护下即可。 #include #include using namespace std; struct cmp{ bool operator () (int原创 2016-07-17 12:39:19 · 191 阅读 · 0 评论 -
UVA 10714 Ants
题意: 给你一个长为L厘米的木棍在上面有n只蚂蚁,蚂蚁的爬行时间均为1厘米/秒,两只蚂蚁先遇会立即调转方向,调转时间不久,并给出每只蚂蚁的位置x[i],问你所有蚂蚁都掉下木棍的最少时间和最长时间。 思路: 最少时间,很明显,但没有蚂蚁相遇时时间最少,最少时间为所有蚂蚁距离木棍两端的最小值的最大值 最长时间,把蚂蚁看成很多个小黑点原创 2016-07-16 18:58:47 · 436 阅读 · 0 评论 -
UVA 10720 Graph Construction
题意: 给你一些点的度数,问你能否构成一张简单图(即是无向图和不存在重边)。 思路: 以前刷图论的题目时,在POJ上做过类似的题目—— 青蛙的邻居POJ1659,那题是这题的加强版。就是根据Havel-Hakimi定理 #include #include using namespace std; const int MAX=10005; int n,d[MAX]; bool cmp(i原创 2016-07-15 11:50:41 · 287 阅读 · 0 评论 -
HDU 4726 Kia's Calculation
题意: 给你两个数A、B,它们的位数一样,现在可以任意移动A、B数中数字的位置,0不能做为首部,并定义不进位的加法,即两个单位数相加结果为单位数%10,问你相加之后能得到的最大值是多少。 思路: 这里位数有10^6位(一开始看错看成数字的大小 #include #include #include using namespace std; const int MAX=1000005; in原创 2016-07-15 11:02:47 · 305 阅读 · 0 评论 -
HDU 4004 The Frog's Games
题意: 有只青蛙要过河,河里有n块石头,每块石头和起点的距离给出,青蛙最多跳k次,每次跳的距离一样,问这个距离的最小值是多少。 思路: 二分这个最小距离,然后去判断下在该距离下能否在k次之内跳到河对岸。 #include #include using namespace std; const int MAX=500005; int L,n,m; int d[MAX]; bool ok(原创 2016-07-15 10:30:33 · 197 阅读 · 0 评论 -
HDU 4768 Flyer
题意: 有一些学生,和n个社团,每个社团会给学号为A[i],A[i]+C[i]。。。。A[i]+k*C[i](A[i]+k*C[i]B[i])的这些人传单,问最后传单个数为奇数的学生的学号。 思路: (1)暴力(这题数据出水了不然20000*2^31的数据量肯定爆了) 利用偶数个数异或为0,奇数个数异或为1的性质,先枚举社团,然后枚举得到该社团学生的学号,将他们都异或起来,最后即可得到学号原创 2016-07-15 10:02:33 · 319 阅读 · 0 评论 -
UVA 11269 Setting Problems
题意: 有s和G两个人、n个任务,对于每个任务S必须先完成G才能做,问如何安排任务使总时间最少。 思路: n简单的贪心题 n有两个人S和G要去做n个任务,对于某个任务,S要先做完G才能做这个任务,也就是说S做任务是无约束的n这里的 ,n #include #include using namespace std; const int MAX=25; struct Text{ int原创 2016-07-15 09:56:09 · 310 阅读 · 0 评论 -
UVA 1471 Defense Lines
题意: 给你一个序列,你只能消除其中连续的一段数,问消除完后剩下的序列中最长连续非严格上升子序列是多长。其实就是两个连续上升子序列的合并,问合并后最长的连续上升子序列是多少。 思路: left[i]表示下标为i的数向左连续扩展的最远距离 right[i]表示下标为i的数向右连续扩展的最远距离 g[i]表示长度为i的连续上升子序列的最右端的那个数 首先,对于一个数a[i],以它为起原创 2016-07-15 10:25:09 · 197 阅读 · 0 评论 -
UVA 11134 Fabled Rooks
题意: 给你n个区域,和一张n*n的地图,你要在这n块区域上放置n辆车,每个区域1辆,且保证每一行每一列只有一辆车。 思路: 这题和8皇后有点类似,但是少了斜线的约束,那我们可以得到行和列之间是没有约束的关系的,即你把1辆车放置在某一行并不影响之后列的放置。所以我们分别按行、列来放置车,即确定车的x、y坐标,这里用贪心的方法,假设先安排行,按每个区域的行的原创 2016-07-15 07:34:45 · 234 阅读 · 0 评论 -
UVA 714 Copying Books
题意: 有n本书,每本有b[i]页,有k个人,问这么划分这n本书让每个人获得的页数尽量接近。 思路: 去二分这个划分后每个人所获得的页数mid,然后判断这个页数是否满足划分了k个人,且每个人所获得的页数均小于二分的页数mid。 #include #include #include using namespace std; typedef long long LL; const int I原创 2016-07-15 08:50:37 · 200 阅读 · 0 评论 -
UVA 10905 Children's Game
题意: 给你n个数,要你用这n个数组成一个最大的数。 思路: 对于两个数a和b,要如何选择哪个数放前面呢?很简单,若ab>ba则选a,若ab #include #include #include using namespace std; const int MAX=55; int n; string a[MAX]; bool cmp(string a,string b){ retur原创 2016-07-18 10:27:15 · 148 阅读 · 0 评论