摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1151 题意:一个城市有m个十字路口(点),n条街道(边),街道是单向的,而且该城市的所有街道不存在环路,现在你要派伞兵空袭,伞兵随机降落在任意的十字路口上,从该十字路口出发能到达的十字路口,该伞兵都能到达(只能选一个到达,也就是说一个伞兵最多2个路口),但只能延一方向前进,不能回头,问,最少需要多少伞兵,能访问该城市的所有十字路口。 题目还说"It is also known that starting from an intersection and walking through town&# 阅读全文
posted @ 2013-02-04 15:39 wuminye 阅读(198) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=4334这题首先想到的就是穷举每一行中的数字,相加看是否为0 。 ----别傻了,n5 的循环,等着超时吧! 现在要做的事如何缩减循环次数。先枚举头两行相加的可能结果,发现有些数的和是重复的!也就是说,可能会有多余的循环存在。于是可以先计算出头两行的所以和结果,再去重,再计算3、4行的和结果、去重,拿前面得到的两个数组再和最后一行枚举相加判断就能得到结果。这样复杂度变为n3快了,但是还不够。可以再把之前得到的两个新数组排序下,枚举第5行,对于每次枚举,两个排序后的数组,一个从小到大,一个从大到小查找,发现相加结 阅读全文
posted @ 2012-11-30 16:14 wuminye 阅读(196) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1052题目内容就是田忌赛马,解决思路就是贪心,关键是要怎么贪,。我在看完题目后想到一种方法,就是田忌速度最大的马开始,尽量和速度最接近的马来比,这样结果无非就是平局或获胜,无法匹配的马就当输了。本以为这样可以减少马“性能”上的浪费,就能得到最优解。但有组数据就能当反例:392 83 7092 91 60按照我的算法,92和92 配对,83就只能和60配了。最优的是92和91配,83和60配。我的算法关键就错在对于平局是可以有两种方法的,但我只处理了一种。下面来正确的: 1.当田忌最慢的马比齐王最慢的马快,赢. 阅读全文
posted @ 2012-11-23 21:12 wuminye 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 题目这样的: 给你这个公式个A、B 求C 。 len(A)=len(b)=n在计算C[k] 时, i 和j 至少有一个等于 k,当 i 和 j 不等时,只要乘另一个的前 k-1 项和就行了。于是 C[k]=A[k]*SumB[k-1]+B[k]*SumA[k-1]+A[k]*B[k] mod 10^9+7 注意初始值。当两个int型变量相乘时,可能会溢出,所以在乘之前要先强制转换成 long long ,为此我还WA了几次~ 1 #include <stdio.h> 2 const int mod=1000000007; 3 int n; 4 int a[100001],b[100 阅读全文
posted @ 2012-11-18 10:26 wuminye 阅读(250) 评论(0) 推荐(0) 编辑
摘要: 近来做题发现个词 “the maximum cardinality matching” ,不明其意,遂百度一番,无解,只好Google,才找到一个很好的说明。我把里面的内容摘录下来,只摘录一些名称介绍,剩下的内容进原网站看。(原文地址:http://www.csie.ntnu.edu.tw/~u91029/Matching.html)导读 因为 Matching 的算法有点复杂,所以我们同时介绍 Matching 和它的特例 Bipartite Matching 。每当要讲解一个算法时,就先提出 Bipartite Matching 的算法,再进一步提出 Matching 的算法,以循序渐进的 阅读全文
posted @ 2012-11-17 19:51 wuminye 阅读(1733) 评论(0) 推荐(0) 编辑
摘要: 最近在做面向对象的研讨作业,在写代码时遇到一些令我抓狂的问题,在经过漫长的检查翻书搜索后总算都解决了。下面把问题提取出来,做个记录。比如说在类内定义了个运算符重载:char & operator[](size_t x);这个是为了能把返回值即当右值又当左值。但是,如果要在加const的参数上使用,则是不允许的:void test(const (类名) & a){a[0];} // error原因是当参数加const 后则不允许使用任何可能修改对象的功能,返回引用也不允许,即使你没有写出修改数据的语句。解决方案是再写个函数重载:1 char & operator[](si 阅读全文
posted @ 2012-11-09 21:38 wuminye 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 快速幂是个快速计算幂次的算法,原理很简单:a^b=a*a*a*a*a*......*a (b个a 相乘) 如果直接计算要做 b-1 次乘法。可以利用幂运算的性质: a^b=(a^c)*(a^d)=a^(c+d) 其中b=c+d如果把b平均分为两份,每份的数量为c=d=b/2, a^c和a^d的值一样,就可以重复利用。这样分一次就只要做 b/2-1+1=b/2次的乘法,若b为奇数,则要做b/2+1次乘法,于是乘法的次数就大大减少,这样重复分几次后,原式的值就能很快地算出来。用递归的代码:1 int QuickPow(int a,int b)2 {3 if (b==1) return a... 阅读全文
posted @ 2012-11-03 23:27 wuminye 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 题目大意是这样的:给定长度为n的序列A[i],求所有A[i] xor A[j] (i<j)的值之和。如序列:7 3 5转化为二进制7:1113:0115:101一位一位计算7 xor 3+3 xor 5+7xor 5 (二进制)=(100 xor 000)+(10 xor 10)+(1 xor 1) //7 xor 3+(000 xor 100)+(10 xor 00)+(1 xor 1) //3 xor 5+(100 xor 100)+(10 xor 00)+(1 xor 1) //7 xor 5按列计算就变成乘法了:1+1+0=2*1=2 0+1+1=2*1=2 0+0+0=... 阅读全文
posted @ 2012-11-03 09:50 wuminye 阅读(510) 评论(0) 推荐(0) 编辑