贪心
文章平均质量分 70
GooMaple
这个作者很懒,什么都没留下…
展开
-
UVa 10716 - Evil Straw Warts Live
题意:判断一个字符串是否能转化成回文串,如果可以就统计转化成回文串所需的最少交换次数。贪心,思路就是先将串两端固定(对应字母移至对应位置),依次向中间夹逼,因为只有依次将字母先放到两端,才可以减少剩下字母交换的次数,先把哪对字母放到两端都可以,因为可以证明出无论移动哪对字母只要是每次都将其放到两端其最后交换次数是一样的。由题意不难判断如果各个字母出现次数均为偶数,那他一定可以转换成回文串,原创 2012-08-17 14:19:49 · 997 阅读 · 0 评论 -
UVa 757 - Gone Fishing
贪心+暴力,从近至远依次枚举可以到达的钓鱼地点,用总时间减去中途消耗的时间,这样就可以将其当成在各个钓鱼地点之间随意转移(实际题目中给出是单方向前行的),然后在已到达的最远的钓鱼地点之内的所有钓鱼地点上按每次钓最大值的鱼做贪心,若时间用不完,则剩余时间加到第一个钓鱼地点上。注意,钓鱼地点最初的钓鱼值可能为零。代码如下:#include#include#include#includ原创 2012-08-16 12:10:03 · 871 阅读 · 0 评论 -
UVa 11129 - An antiarithmetic permutation
本来以为是比较简单的一个题,结果是理解错题意了,本以为题意是相邻的三个数不能为等差数列,结果WA了,看了其他人的代码才知道题目的意思是不相邻的只要是一个方向的也不能为等差数列。这样难度就比较大了,思考了半天也没想出什么好办法来,参考了他人的代码,基本思路是用递归将序列不断分为奇偶序列(按位置分),然后在合并,直到不能分为止,得到的便是没有等差子序列的排序。代码如下:#include#原创 2012-08-07 15:59:58 · 950 阅读 · 0 评论 -
UVa 321 - The New Villa
本来想用bfs(房间的状态)+dfs(灯的状态)+哈希的,但最后发现同一个房间可以反复进好几次以实现部分灯的开关,这样的话每一步都dfs其代价就会很大。参考了其他人的程序,用纯 bfs+哈希(记录状态共有10*2^10) 足矣。代码如下:#include #include #include #include #include #include using namespace原创 2012-10-28 23:54:50 · 1060 阅读 · 0 评论 -
UVa 10905 - Children's Game
题目不难,就是凑最大数,不过qsort得特殊处理一下,两个数字字符串交换位置比较一下,取较大的情况,记得数组开大点,太小了也是WA ~代码如下:#include#include#include#include#include#includeusing namespace std;int n_cmp(const void *a,const void *b){原创 2012-07-31 09:41:55 · 1040 阅读 · 0 评论 -
UVa 10714 - Ants
经分析,最小值就是看最靠近中间的点到其较近的端点的距离,最大值为最小点距右端点的距离与最大点距左端点的距离中的较大的那个。代码如下:#include#include#include#include#includeusing namespace std;const int maxn = 1000002;int cmp(const void *a, const void *b)原创 2012-08-02 14:54:04 · 754 阅读 · 0 评论 -
UVa 993 - Product of digits
分解因子,从9开始分解,一直分解到2。0与1需要特殊处理。代码如下:#include#include#include#include#include#includeusing namespace std;int main(){#ifdef test freopen("in.txt", "r", stdin);#endif int t, n, a[原创 2012-08-07 11:08:06 · 697 阅读 · 0 评论 -
HDU 4278 Faulty Odometer
统计从1~n除去含有‘3’‘8’数字外所有的数字的个数。可以分别统计出每加10,每加100,每加1000...中含有多少个含有数字‘3’‘8’的数字的个数(开头数字为‘3’‘8’的特殊处理),最后全部加起来,再用n减去它,就是1~n不含数字‘3’‘8’的个数。代码如下:#include #include #include #include #include #include原创 2012-09-09 20:42:55 · 925 阅读 · 0 评论 -
UVa 10954 - Add All
哈尔曼编码的算法。实质就是每次两个最小的相邻数相加,直到只剩一个数为止,然后把过程中所有的和加起来,较难处理的点就是每次加完了要保证下次相加的必须是最小的两个数。在这里因为看见数据量比较小(5000个),因此用的O(n*n)的办法做的,就是每次做完和都找到相应位置将数字插进去,前面的数依次向前移动一位,以此保证整个序列始终有序;本来想用排序做,但想想如果每加一次qsort排一次序的话,复杂度为原创 2012-08-02 16:34:23 · 1032 阅读 · 0 评论 -
UVa 10602 - Editor Nottoobad
贪心,从第一个给定的字符串开始,每次都选取与前一个字符串的前缀最大匹配的字符串为下一个字符串,以此类推。代码如下:#include#include#include#include#include#includeusing namespace std;struct group{ char w[102]; int num;};int b_cmp(co原创 2012-08-07 13:59:51 · 954 阅读 · 0 评论 -
HDU 1735 - 字数统计
贪心,只要开头有两个0,则需要判断其上一行最后有多少个连续的0,按上一行最后处0的数量由大到小排序(因为要令破坏字数最小,因此需要令其可转换为1(即可确定的字数)的0的数量最大)。最后特殊处理一下,第一行开头和最后一行结尾的0即可。代码如下:#include#include#include#include#includeusing namespace std;int me原创 2013-02-02 22:56:37 · 1185 阅读 · 0 评论 -
UVa 714 - Copying Books
“最大值最小化”问题,先二分求最大值,再贪心实现按最左边区间最小的格式输出 。代码如下:#include#include#include#include#includeusing namespace std;int main(){#ifdef test freopen("in.txt", "r", stdin);#endif int a[505原创 2012-08-02 11:04:55 · 1022 阅读 · 0 评论 -
HDU 4190 - Distributing Ballot Boxes
贪心+二分,最大值最小化问题。利用投票箱b的值是一定的,将投票数进行二分,使得算出的投票箱数始终为b。代码如下:#includeint city[500001];int main(){ int n, b; while(scanf("%d%d", &n, &b)) { int Max = 0, l, r, mid; if(n=原创 2013-02-07 18:13:32 · 828 阅读 · 0 评论 -
UVa 11100 - The Trip, 2007
贪心,类似于“陶瓷娃娃”,可以想一下,如果全是不同规格的背包,那么他们就可以依据大小关系一个套一个全部套进一个包中。因此,包的个数取决于重复次数最多的那个规格的包,这个题难点在于怎么将其按套件输出,这里可以在排序之后从最大的依次开始往后输出,每次输出的序列以最大重复次数为公差依次向前输出直到序数小于0为止。不过在这里还是WA了一次,看到样例都是输出的一对一对的数字,本还以为是只输出每对套层原创 2012-08-08 20:54:41 · 1396 阅读 · 0 评论 -
UVa 11054 - Wine trading in Gergovia
贪心,本来想的贪心方法是找到每一个需求量为正数的居民,往两边搜,搜到最近的那个需求量为负的居民,权衡需求量与销售量不难最少使其中的一个变为零,另外一个如果不为零,则减去或加上另一个的需求量,不断重复操作,直到所有居民的数值均为零。虽然后来中间也做了不少剪枝,但最后还是TLE了。后来参考了http://hi.baidu.com/knowledgetime/blog/item/fbcfe9c9b6原创 2012-08-10 16:17:16 · 1444 阅读 · 0 评论 -
HDU 4070 Phage War
Phage WarTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 721 Accepted Submission(s): 382Problem DescriptionPhage War is a lit原创 2012-08-12 09:54:27 · 1079 阅读 · 0 评论 -
UVa 10148 - Advertisement
一个区间取点问题,按右端点排序。从右端开始标注,保证每段区间都有K个标注点,小于K的区间则保证其区间的点全部被标注,在标注时注意因为范围是-10000~10000,因此需要用一个20000的数组存,需将整体范围往右移动10000(例:标注-10000为a[0] = 1,标注0为a[10000] = 1),保证其全部大于零。#include#include#include#includ原创 2012-08-15 16:01:19 · 978 阅读 · 0 评论 -
UVa 10670 - Work Reduction
贪心题,只要每一步都保证B的费用小于等于A的费用,则一直用B方案,否则用A方案结束,唯一值得注意的是在B方案减半时不能使N的值小于M的值(题目中有要求)。代码如下:#include#include#include#include#includeusing namespace std;struct agency{ int A, B, V; char na原创 2012-08-10 21:10:22 · 828 阅读 · 0 评论 -
UVa 10720 - Graph Construction
贪心,为保证其尽可能为图,要优先考虑大度数之间的点优先连接。在这里可以采取依次减度数的方法推断能否构成图。如:3,3,2,2,1五个点,从度数最大的开始考虑,先去掉3,则后面紧接的三个点度数依次减去1,剩下的四个点排序后为2,1,1,1,再去掉度数最大的2,后面的两个点一次减去1,排序后剩下三点为1,0,0,1后的一点度数再减去1,则为-1,明显不成立,为Impossible。代码如下:原创 2012-08-10 14:31:20 · 818 阅读 · 0 评论 -
ZOJ 1877 Bridge
BridgeTime Limit: 2 Seconds Memory Limit: 65536 KB Special Judgen people wish to cross a bridge at night. A group of at most two people may cross at any time, and each group must hav原创 2012-08-01 14:16:15 · 1087 阅读 · 0 评论 -
UVa 10382 - Watering Grass
实际上就是区间覆盖的变形,显然圆形能覆盖的矩形区域为圆形与总区域相交的长度,这就将圆形全部转换成了线段,这样就可以按区间覆盖来做了。但是这个题比较恶心的地方是卡了比较严格的精度,这里需要额外注意一下。代码如下:#include#include#include#include#includeusing namespace std;struct point{原创 2012-08-15 11:51:12 · 1233 阅读 · 0 评论 -
UVa 10718 - Bit Mask
贪心,M在保证与N做OR运算的结果最大的基础上,使M的值最小。可以先将上界和下界都转化为二进制,先确定M的最高位,M的最高位可以从u的最高位开始试(理由很简单),再依次确定之后的数字,每个数字尽量保证与N的二进制相应位置的数字互补(如果N的二进制的某一位是 1,则M的相应位尽量为0,这样才也能保证总值最大,M值尽量小),但也要保证在每一位贪心的过程不能使M值超过[N,M]的范围。代码如下:原创 2012-08-09 20:40:19 · 1042 阅读 · 1 评论 -
UVa 10706 - Number Sequence(POJ 1019)
乍一看数据范围真是有点吓人,单纯暴力肯定超时。观察数字可以找到规律:数字范围 数字位数范围 每个数字宽度 总共数字所占位数1~9 : 1~9. 1 4510~99: 11~189 2原创 2012-08-06 10:18:55 · 1194 阅读 · 0 评论 -
ZOJ 3474 Taekwondo
TaekwondoTime Limit: 2 Seconds Memory Limit: 65536 KBAlice is very fond of Taekwondo and he is also a member of Taekwondo Association of Zhejiang University. One day, his friends decide t原创 2012-08-04 10:19:53 · 605 阅读 · 0 评论 -
UVa 10020 - Minimal coverage
基本思路:已知目标线段[0,m],在所有给出线段左端点值小于目标线段左端点值的线段中,选出所对应右端点值最大的点,并用y的值不断更新左端点的值,直到y值大于M,跳出。在做之前需要预处理一下,将与目标线段无交集的线段全部滤去,并判断给出的左右线段的最右值和最左值是否能将目标线段覆盖。代码如下:#include#include#include#include#include原创 2012-08-02 11:12:43 · 768 阅读 · 0 评论 -
UVa 311 - Packets
题目大意:有1*1,2*2,3*3,...六种小包裹,往6*6的箱子里装,给出六种小包裹各自的数量,求出最少用的箱子的个数。贪心,思路还是比较简单的,先从大的开始往小的装。6*6的包裹,每个单独装一个箱子;5*5的包裹,可以和11个1*1的搭配;4*4的包裹,可以喝5个2*2的搭配;...以此类推(注意3*3的有四种搭配方案)。这里可以每次优先用2*2的去填原创 2012-08-02 11:09:51 · 1070 阅读 · 0 评论 -
UVa 10037 - Bridge
贪心问题,有两种最优方式,一种是最小次小走与最大次大走轮流的搭配,另一种是最小最大一块走的搭配,需要一定的判定条件 ~在此给出两种不同情况的数据第一种(样例):412510第二种:41345代码如下:#include#include#include#include#includeusing namespace std;原创 2012-08-02 11:08:16 · 615 阅读 · 0 评论 -
HDU 4415 Assassin’s Creed
杭州网络赛的题,可以假设杀掉一个敌人后,剑落在地上,以后还可以捡起来,这样问题就可以简化不少。/** 贪心题,俩种方式,一种优先考虑bi不为0的情况,因为这样可以造成不消耗耐久连续杀人;一种优先考虑,bi为0的情况,比如特殊数据:input:5 81 02 02 03 06 1output:4 83 7 或 3 8(为错误答案)只考虑bi为0的个体,比先考虑原创 2012-09-25 11:52:17 · 1947 阅读 · 0 评论 -
UVa 10465 - Homer Simpson
可以用完全背包来做,也可以用贪心的方法来做。贪心的话:(1)如果恰好可以凑成t,则更新最大汉堡数(即:A+B最大)。(2)如果凑不成t,则在 t-max最小的情况下,更新A+B的最大值。贪心法(0.024s):#include #include #include #include using namespace std;int _max;int main(原创 2013-04-26 21:21:34 · 1056 阅读 · 0 评论