IT民工
加油!
摘要: 2012天津赛区现场赛的E题,刚才做模拟比赛的时候和安神讨论了很久,思路没理清。大致题意是 给出N个点,让你选择性地建立加油站,在第i个点建立加油站的费用为2^i-1,要使自己能从1号点经过所有点回到原点,点可以重复经过,加油费用不计,每次加油最多能跑的距离为D。输出的答案是2进制,由费用10进制转化过来就是在第i个点建立加油站,答案从右往左数第i个值就为1。第一步判断所有点都建立加油站能不能完成题目的要求,不能输出-1。能完成要求的话,我们注意到建站费用是和点的编号有关的,比如第i个点建站的费用是等于前i-1个点都建站的费用+1,二进制的规律。然后我们可以从后往前判断当前加油站能不能拆。di 阅读全文
posted @ 2012-10-28 21:25 找回失去的 阅读(686) 评论(0) 推荐(0) 编辑
摘要: /*g(0)=0,g(1)=1。状态2的后继有0,1和(1,1),它们的SG函数值分别是0,1和0,所以g(2)=2。状态3的后继有0,1,2和(1,2),它们的SG函数值分别是0,1,2和3,所以g(3)=4。状态4的后继有0,1,2,3,(1,3)和(2,2),它们的SG函数值分别是0,1,2,4,5和0,所以g(4)=3。我们推测:对于所有的k>=0,有g(4k+1)=4k+1;g(4k+2)=4k+2;g(4k+3)=4k+4;g(4k+4)=4k+3。*/#include <stdio.h>int main(){ int T; scanf("%d" 阅读全文
posted @ 2012-10-22 17:09 找回失去的 阅读(272) 评论(0) 推荐(0) 编辑
摘要: /*第一步判断是不是先手必败非先手必败的话必有解,则输出sg为0的点*//*Accepted 2176 109MS 972K 687 B G++ Yu*/#include <stdio.h>const int MAXM = 200200;int a[MAXM];int main(){ int ans; int m; while(scanf("%d", &m), m) { ans = 0; for(int i = 0; i < m; i ++) { scanf("%d", ... 阅读全文
posted @ 2012-10-22 16:43 找回失去的 阅读(225) 评论(0) 推荐(0) 编辑
摘要: /*[1-p]必败 [p+1,p+q]必胜(取一个q,就能进入第一个区间)[p+q+1,2*p+q]必败,[2*p+q+1,2*p+2*q]必胜*///对p+q取余即可#include <stdio.h>int main(){ int n, p, q; while(scanf("%d%d%d", &n, &p, &q) != EOF) { int ret = n % (p + q); if(ret >= 1 && ret <= p) puts("LOST"); else puts(" 阅读全文
posted @ 2012-10-22 13:33 找回失去的 阅读(203) 评论(0) 推荐(0) 编辑
摘要: /*当n为1的时候是输出first,n为2的时候输出second,3的时候也是输出second,当n为4的时候,第一个人想获胜就必须先取一个,这是剩余的石子数为3,此时无论第二个人如何取,第一个人都能够赢,当n为5的时候,first不可能获胜,因为他取2时,second直接取掉剩余的3个,取1时,second也是取1,这样就演变为n为3的时候了,所以n为5时候,输出的是second ,当n为6的时候,first只要取掉1个,就可以让局势变为n为5的时候,输出的是first,n为7的时候,first取掉2个,又可以变为5的时候,所以也是输出first,n为8的时候,当first取1个时候,局势变 阅读全文
posted @ 2012-10-22 13:06 找回失去的 阅读(295) 评论(0) 推荐(0) 编辑
摘要: /*Accepted 2147 0MS 200K 173 B C++ Yu */#include <stdio.h>//n和m不同为奇数,先手胜int main(){ int n, m; while(scanf("%d%d", &n, &m), n + m) { puts( ((n & 1) && (m & 1))? "What a pity!" : "Wonderful!"); } return 0;} 阅读全文
posted @ 2012-10-20 11:53 找回失去的 阅读(107) 评论(0) 推荐(0) 编辑
摘要: /*Accepted 1564 0MS 200K 135 B C++ Yu */#include <stdio.h>//画图YY//奇数先手赢,反之后手int main(){ int n; while(scanf("%d", &n), n) { puts(n & 1 ? "ailyanlu" : "8600"); } return 0;} 阅读全文
posted @ 2012-10-20 11:27 找回失去的 阅读(129) 评论(0) 推荐(0) 编辑
摘要: /*巴什博弈当取的石子总数为b + 1的倍数时,先取必败,因为对手每次都能凑出b + 1的倍数,通过取1......b的一种情况。*/#include<stdio.h>int main(){ int a, b, t; scanf("%d", &t); while(t --) { scanf("%d%d", &a, &b); a = a % (b + 1); puts((a) ? "first" : "second"); } return 0;} 阅读全文
posted @ 2012-10-20 11:13 找回失去的 阅读(170) 评论(0) 推荐(0) 编辑
摘要: /*巴什博弈我们注意到可以取的牌数包含了1和2这两种情况,剩下的不用管,当你给对手剩下3*n张牌时,你就赢了。巴什博弈的模型..*/#include<stdio.h>int main(){ int n; while(scanf("%d", &n) == 1) { puts(n % 3 == 0 ? "Cici" : "Kiki"); } return 0;} 阅读全文
posted @ 2012-10-20 11:12 找回失去的 阅读(123) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 1005;int fib[MAXN], e[MAXN], h[20];void calcFib(){ int i; fib[1] = 1, fib[2] = 2; for(i = 3; i <= 16; i ++) { fib[i] = fib[i - 1] + fib[i - 2]; }}/*求SG值*/void calcE(){ int i, j, k; e[0] = 0, e[1] = 1; ... 阅读全文
posted @ 2012-10-20 11:11 找回失去的 阅读(148) 评论(0) 推荐(0) 编辑