03 2013 档案
UVA10718 - Bit Mask
摘要:看到这个题我们简单的思路就是从L到R逐个数的暴力,但是人家有明显提示了,所以我们要另寻妙法了要求从某个范围里找到M,使得M|N最大,如果有多个M满足最大的话就输出最小的,考虑第一个条件,找到M使得M|N最大,那么我们应该从二进制方向出发,使得M|N最大,则我们从最高位到最低位比较,如果N对应的数是0的话,在其他条件合适的话肯定让M对应的该位数为1。如果N对应的数是1的话,则此时我们为了满足第二个条件,应当使得M的该数位上的数为0,但是我们还要考虑范围因素,每次都得判断M|N是否在范围内,如果超过了,则就舍弃该数位等于1的机会,如果还不足L,则及时加上,即让该数位等与1#include int. 阅读全文
posted @ 2013-03-31 21:15 Primo... 阅读(139) 评论(0) 推荐(0)
uva10400 - Game Show Math
摘要:看到这道题,确实让我想到了dfs,但是p=100的上限让我望而却步,,,,后来知道dfs+强剪枝或者称为记忆化搜索dp这道题为什么记忆化搜索后变得这么高效呢,从4^100>>>64000*100是怎么转变的呢,原因是这道题的特设条件,(-32000,32000)顶多有64000个状态,每个数有可能在100层中的任何一层的话,那么时间复杂度就变成了64000*100了这就是记忆化在特定区域内的作用。。。。。代码如下:#include #include #define M 105 int st[M], targe, n, pa[M], dp[M][64010]; int dfs( 阅读全文
posted @ 2013-03-31 16:44 Primo... 阅读(155) 评论(0) 推荐(0)
uva10602 - Editor Nottoobad
摘要:大水题。。。比较前缀,,,,,代码如下:#include #include #define M 105 char st[M][M]; int path[M], fl[M]; int get_result(int a, int b) { int len = strlen(st[a]); for(int i = 0; i < len; i++) if(st[a][i]!=st[b][i]) return i; return len; } int main () { int t, n, ans, max; scanf("%d",&t); w... 阅读全文
posted @ 2013-03-31 11:19 Primo... 阅读(144) 评论(0) 推荐(0)
uva714 - Copying Books
摘要:二分+贪心二分是在一个合理区间内找到合理的答案, 对于这个题则是在合理区间内找到最大的上限。但是我们得考虑以下得到个例:9 610 10 10 10 10 10 10 10 10AC:10 / 10 / 10 / 10 / 10 / 10 10 / 10 10WA:10 / 10 / 10 / 10 / 10 10 / 10 10 / 10考虑清楚上面这个情况。我的代码就AC了代码如下:#include #include int n, k, book[510], f[510]; long long L, R; int is_ok(long long m) { int ans = 0... 阅读全文
posted @ 2013-03-29 23:08 Primo... 阅读(148) 评论(0) 推荐(0)
uva10714 - Ants
摘要:这个题的思路很抽象,如果一头扎进去是很难出来的,我们要站在一个高度看这个问题。其实一个任务的完成不一定只靠一个蚂蚁,:::case:一个蚂蚁A朝一个方向走,当它撞到另一只蚂蚁B的时候,虽然A按照原速朝反向走,B却朝A的方向走去了,我们可以认为A把他的任务交给了撞它的那只蚂蚁B来完成了,假如B后来再次撞到其他蚂蚁的话,那么A的这个任务继续接力似的传递下去,同理刚才A接走了B当时携带的任务,所以每只蚂蚁都能完成自己的路程。我们也可以认为每只蚂蚁都会虚体,都不会撞着对方。这样以来,题目就简单了。代码如下:#include #include int main () { int cas, l... 阅读全文
posted @ 2013-03-29 16:55 Primo... 阅读(166) 评论(0) 推荐(0)
uva10020 - Minimal coverage
摘要:选取最少的区间来覆盖[0,M]。。。基本思想都是排序,然后处理但是难点是怎么处理100 85 98 10这样的样例,因为5,9夹在上下两者之间,但是这个区间是不起作用的,有办法避免[5,9],这个题就简单了代码:#include #include #define M 100010 int m, a[M][2], pa[M]; int comp(const void *a, const void *b) { int *aa = (int*)a, *bb = (int*)b; return aa[0]-bb[0]; } int main () { int cas, n,... 阅读全文
posted @ 2013-03-28 22:54 Primo... 阅读(174) 评论(0) 推荐(0)
uva10954 - Add All
摘要:不错的题目,一开始的时候题意理解不清,看discuss才知道某些隐藏的题意。就是每次从现成的数列中选取最小的两个数相加,然后把新的数也加入到数列中,并把原来的两个数删掉。算法,既然开一个数组,新的成员很难加入,那就开两个数组,把所有的新成员加到新数组里,然后比较的时候也得把新数组里的数考虑进去。然后经历了TLE-RE->ACTLE是因为我用的通用算法,每次都排序。RE是因为我在循环中忘了加限制条件,代码如下:#include #include using namespace std; #define INF 0x7fffffff const int size = 5000+10; lon 阅读全文
posted @ 2013-03-28 16:28 Primo... 阅读(146) 评论(0) 推荐(0)
uva311 - Packets
摘要:经典的贪心题目,先放大的,3x3/4,4x4,5x5,6x6,这些只能占据一个包裹的物品,再放那些小的,,,对于那些小的,先放缝隙,然后在占据新的包裹。这道以前做过,但是代码太繁琐了,经过精简,代码如下:#include int pake[7]; int main () { int n, s, ok, tt; while(1) { ok = 0; for(int i = 1; i 0) { n+=pake[1]/36; if(pake[1]%36) n+=1; ... 阅读全文
posted @ 2013-03-27 22:25 Primo... 阅读(156) 评论(0) 推荐(0)
uva10026 - Shoemaker's Problem
摘要:大水题,,,贪心,代码如下:#include #include #define M 1010 int st[M][3]; int comp(const void *a, const void *b) { int *c = (int*)a, *d = (int*)b; if(c[0]*d[1]-c[1]*d[0]!=0) return c[0]*d[1]-c[1]*d[0]; else return c[2]-d[2]; } int main () { int t, n; scanf("%d",&t); while(t--) {... 阅读全文
posted @ 2013-03-27 20:55 Primo... 阅读(155) 评论(0) 推荐(0)
uva10700 - Camel trading(无括号的表达式)
摘要:大水题,不过我要声明一点,::uva提交系统上对long long 的标识符是lld,而不是I64d。代码如下:#include #include int num[20]; char ope[20]; long long print_min(int n) { long long tt[20], cur = 0, ans = 0; tt[0] = num[0]; for(int i = 1; i < n; i++) { if(ope[i-1]=='*') tt[cur]*=num[i]; else tt[++cur] = num... 阅读全文
posted @ 2013-03-27 17:47 Primo... 阅读(158) 评论(0) 推荐(0)
uva10340 - All in All(子序列判定)
摘要:做到这里了,心里还有有些疑惑,这一章不是高效算法吗??为什么我做了这么多了,写的还是通用算法啊,这个题是大水题,不多说了。小经验, 在for循环中,有continue和break两类强制性命令,这两个命令我们要知道一点:for(int i = 0; i #include #define SIZE 1000000 char s[SIZE], t[SIZE]; int main () { int lens, lent; char tt; while(scanf("%s%c%s",s,&tt,t)!=EOF) { int i, j, ok; ... 阅读全文
posted @ 2013-03-27 16:34 Primo... 阅读(175) 评论(0) 推荐(0)
uva10487 - Closest Sums
摘要:又是一个水题,但是吧,自己写的代码还是不够高效。思路,把所有的两数之和存到数组里,然后排序+二分查找。这应该是通用思路吧,反正见到老多人的代码都是跑了200+ms。后来看了一个跑了64ms的代码,我才明白,自己的代码排序很耗时的,,,,,,先贴一下自己的代码:#include #include const int M = 1000/2*(1000+1)+10; int st[M], a[1010], c; int comp(const void*a, const void *b) { return *(int*)a - *(int*)b; } int bina_search(int... 阅读全文
posted @ 2013-03-26 18:04 Primo... 阅读(142) 评论(0) 推荐(0)
uva10706 - Number Sequence
摘要:这个题又体现了数组的妙用。不过这个题的上界结束的很巧妙。程序跑的也不长,16ms。不过不是我憋出来的,而是又作弊的看了人家的代码。。。用两个数组分别存数位长度和总长度。然后判断,最后那个取余运算也很巧妙。。。代码如下:#include #include const int M = 31268+10; using namespace std; int f[M], s[M]; int main () { for(int i = 1;; i++) { f[i] = f[i-1]+(int)(log10(i))+1; s[i] = s[i-1]+f[... 阅读全文
posted @ 2013-03-25 23:21 Primo... 阅读(148) 评论(0) 推荐(0)
uva10057 - A mid-summer night's dream
摘要:这么水的题我还是WA了2次,,,,好了,说说我是怎么错的吧。1:忽略了每个数出现多次的情况。2:没想清楚一个数如果出现多次该怎么办。思路:加入出现a,b,c,d,e,f,g等7个数,求最小的A,我们可以把7个非负整数放到数轴上,这样就变成了找到一个A点使得此点到其他7个点的距离只和最小。这样我们就好办了,把所有的坐标排序,找到最中间的那个即可了,就是我们要找的最小的满足条件的数值,输入中出现的符合条件的数:如果n是偶数,则把mid和mid+1位置的数出现的次数加起来即可,(此处要注意这两个位置的数是否相等)如果n是奇数,则只需统计mid位置的数即可。符合条件的数的个数:还是的分情况,若偶,则m 阅读全文
posted @ 2013-03-25 20:38 Primo... 阅读(170) 评论(0) 推荐(0)
uva10341 - Solve It
摘要:我的代码从1e-4一直改到1e-7,才AC掉,原因其实很简单,printf的取值是按照四舍五入原则的,举个例子,假如最后的区间为(0.9994,0.9995),那么第5位小数位上的数就至关重要了,无巧不成书的话,第5位小数为4,那么第六位小数又至关重要了,如小于等于4的话,那么最后的结果是0,9994,如果大于等于5的话,那么最后的结果就变成了0.9995了。所以,我们以后做这样的题目的时候要多向后精确3位或者更多。。。代码如下:#include #include int p, q, r, s, t, u; double ans(double x) { return p*exp(-... 阅读全文
posted @ 2013-03-24 21:30 Primo... 阅读(159) 评论(0) 推荐(0)