上一页 1 2 3 4 5 6 7 8 ··· 18 下一页
摘要: 1. 简单贪心,价格低的优先考虑。code:#include<cstdio>#include<cstring>#include<fstream>#include<cstdlib>usingnamespacestd;#definereadfreopen("milk.in","r",stdin)#definewritefreopen("milk.out","w",stdout)structnode{intpri,cnt;}q[5001];intcmp(constvoid* 阅读全文
posted @ 2012-05-23 17:19 追逐. 阅读(167) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1754 基础线段树,单点替换,区间最值。code:#include<cstdio>#include<algorithm>usingnamespacestd;#definelsonl,m,rt<<1#definersonm+1,r,rt<<1|1constintmaxn=200010;intsum[maxn<<2];template<classT>inlinevoidscan_d(T&ret){charc;ret=0;while(( 阅读全文
posted @ 2012-05-09 08:39 追逐. 阅读(216) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1166 最基础的线段树,单点更新。完全跟着HH的代码风格写的。code:#include<cstdio>#definelsonl,m,rt<<1#definersonm+1,r,rt<<1|1constintmaxn=50005;intsum[maxn<<2];voidPushUp(intrt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}voidbuild(intl,intr,intrt){if(l==r){sca 阅读全文
posted @ 2012-05-09 08:35 追逐. 阅读(212) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=3980 求sg值。 一开始被第二个样例卡住了,读了好几遍题才发现它初始是个环。 这样就可以先把它变成链,然后在链上枚举取m个连续点,每次都可以将这条链分成两部分,相当于两个子游戏。对于一个链,一共有n-m-i个子游戏对,用vis数组标记好这些子游戏对的异或值,最后就可以找出sg[n]。 这算是我做的第三种类型求sg值的题吧。code:#include<cstdio>#include<cstring>intsg[1001],m;intmex(intn){if(sg[n]!=-1)retu 阅读全文
posted @ 2012-05-05 11:03 追逐. 阅读(357) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1536 计算sg值。 注意两个地方: 1. s是无序的。 2. 不能对n=10000打表,因为能取的个数是给定的,会有打不到的点。code:#include<cstdio>#include<cstring>ints[101],sg[10001],k;intmex(intn){if(sg[n]!=-1)returnsg[n];boolvis[101];//n最多有100个后继inti;memset(vis,false,sizeof(vis));for(i=0;i<k;i++){if 阅读全文
posted @ 2012-05-04 20:10 追逐. 阅读(252) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1847 和toj1180完全一样的题。 用sg函数写一下。将1000内的sg值打表即可。code:/*#include<cstdio>intmain(){intn;while(~scanf("%d",&n)){if(n%3)printf("Kiki\n");elseprintf("Cici\n");}return0;}*/#include<cstdio>#include<cstring>intsg[1001 阅读全文
posted @ 2012-05-04 11:01 追逐. 阅读(197) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1907 Nim的变形,最后取为败,详见http://www.cnblogs.com/tanky_woo/archive/2010/08/20/1804464.html中取火柴游戏2。 这里总结下结论: 1. 当所有堆个数都为1时,若为奇数堆,即异或不为0,则先手败,反之先手胜。 2. 非所有堆个数都为1时,则异或不为0先手胜。 用上述博文中的定义则为T0, S1, S2为必胜态,T1, S0为必败态。code:#include<cstdio>intmain(){intt,n,f,i,a,sum;s 阅读全文
posted @ 2012-05-04 10:02 追逐. 阅读(284) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1704 把数组倒置(17 14 12 9 7 6 5 1),将相邻棋子的间距视为一堆石子(2 1 2 0 0 3),那么题中所给操作即为把后一堆石子中的n个放到前一堆石子中,这样就转化为了阶梯博弈。用阶梯博弈的解法直接奇位异或就ok了。 在其他博客里还看到一种解法,从后向前两两分组,奇数个点则在最前加一个0结点。把两个结点间的间距看作一堆石子。 1.若对手移动两个中的前一个,那么后一个一定可以移动同样多的位置 2. 若对手移动两个中的后一个,那么等同于从这堆石子中拿出n个 这不就是阶梯博弈么?对偶数堆的操作可以忽视,奇数堆异或即为解。干.. 阅读全文
posted @ 2012-05-04 09:46 追逐. 阅读(236) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1850 Nim博弈,求保证先手必胜可选的方案数。 对于一个必胜的局面,至少有一个方案可以到达必败局面。也就是说,对于a1^a2..^an!=0一定有一个ai可以改为ai',且a1^a2..^ai'..^an==0。设a1^a2..^an=k,则一定存在某个ai,它的二进制表示在k的最高位上是1(因为k的最高位为1),那么有ai^k<ai成立。则a1^a2..^an^k=0,可得ai'=ai^k。 题意找有多少种先手必胜的方案,枚举ai,统计满足ai^k<ai的个数即可。co 阅读全文
posted @ 2012-04-29 20:51 追逐. 阅读(200) 评论(0) 推荐(0) 编辑
摘要: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2971 开始想用map的键值对来做,想想发现没必要,直接模拟就可以了。用一个数组打出0—20和30,40..90等数的英文,输入时进行匹配,匹配成功便通过它们与下标之间的关系确定。输入为million,hundred,thousand时,当前值要乘相应10^n。 用三个数n1, n2, n3分别记录每三位数,最后相加即可。code:#include<cstdio>#include<cstring>usingnamespacestd;charstr[ 阅读全文
posted @ 2012-04-28 22:03 追逐. 阅读(432) 评论(0) 推荐(1) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 18 下一页