HDU 4435 charge-station
摘要: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
找回失去的
阅读(700)
推荐(0)
HDU 3032 Nim or not Nim?
摘要:/*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
找回失去的
阅读(277)
推荐(0)
HDU 2176 取(m堆)石子游戏
摘要:/*第一步判断是不是先手必败非先手必败的话必有解,则输出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
找回失去的
阅读(231)
推荐(0)
HDU 2897 邂逅明下
摘要:/*[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
找回失去的
阅读(207)
推荐(0)
HDU 2516 取石子游戏
摘要:/*当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
找回失去的
阅读(305)
推荐(0)
HDU 2147 kiki's game
摘要:/*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
找回失去的
阅读(113)
推荐(0)
HDU 1564 Play a game
摘要:/*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
找回失去的
阅读(132)
推荐(0)
HDU 1846 Brave Game
摘要:/*巴什博弈当取的石子总数为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
找回失去的
阅读(180)
推荐(0)
HDU 1847 Good Luck in CET-4 Everybody!
摘要:/*巴什博弈我们注意到可以取的牌数包含了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
找回失去的
阅读(128)
推荐(0)
HDU 1848 Fibonacci again and again
摘要:#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
找回失去的
阅读(157)
推荐(0)
HDU 1849 Rabbit and Grass
摘要:/*转换成Nim模型,对于每个棋子位于的位置b,G[b] = 0,即sg[b] = b多个棋子异或一遍就得出答案了,为0先手必败。*/#include<stdio.h>int main(){ int n, a, b; while(scanf("%d", &n), n) { scanf("%d", &a); n --; while(n --) { scanf("%d", &b); a ^= b; } puts(a ? "Rabbit Win!" : "...
阅读全文
posted @
2012-10-20 11:07
找回失去的
阅读(203)
推荐(0)
HDU 1850 Being a Good Boy in Spring Festival
摘要:/*Nim模型*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXM = 105;int m, ni[MAXM];int main(){ int i, cnt, res; while(scanf("%d", &m), m) { res = cnt = 0; for(i = 1; i <= m; i ++) { scanf("%d", &ni[i]); res ^= ni[i]; } ...
阅读全文
posted @
2012-10-20 11:06
找回失去的
阅读(142)
推荐(0)
HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者
摘要:/*巴什博弈的模型*/#include<stdio.h>int main(){ int n, m, T; scanf("%d", &T); while(T --) { scanf("%d%d", &n, &m); puts((n % (m + 1)) ? "Grass" : "Rabbit"); } return 0;}
阅读全文
posted @
2012-10-20 11:04
找回失去的
阅读(168)
推荐(0)
HDU 2149 Public Sale
摘要:/*巴什博弈先判断是不是先手必败*/#include<stdio.h>int main(){ int m, n, i; while(scanf("%d%d", &m, &n) != EOF) { if(m > n) //这种情况先手非必败的话只有一种出法 { if(m % (n + 1) == 0) { puts("none"); continue; } else prin...
阅读全文
posted @
2012-10-20 11:01
找回失去的
阅读(193)
推荐(0)
HDU 4417 Super Mario
摘要:划分树 + 二分二分枚举第k小的数与h比较大小。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>using namespace std;const int MAXN = 100100;struct Node{ int l, r;}T[MAXN << 2];int d[MAXN], s[MAXN], t[35][MAXN], tol[35][MAXN];void build(int level, int rt, int l, int
阅读全文
posted @
2012-09-23 17:20
找回失去的
阅读(1114)
推荐(0)
HDU 3650 Hot Expo
摘要:贪心,以时间点i开始的活动数目为beg[i],结束的记为end[i],然后每扫到一个开始和结束,数组都计数。然后统计一天同一个时间点有多少个开始就行了,遇到结束要减去。最小的天数就求出来了。/*Accepted 3650 15MS 916K 881 B C++ Yu*/#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>using namespace std;const int MAXN = 24 * 3600;int beg[MAXN + 10]
阅读全文
posted @
2012-09-17 15:28
找回失去的
阅读(236)
推荐(0)
HDU 4296 Buildings
摘要:让上面的w和s都尽可能小,即w+s升序排序,值小的放在上面。这样一来,不管是w很大s很小或者s很大w很小,都可以使得最大的PDV尽可能地小,可以用笔写写看。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>using namespace std;typedef __int64 LL;const int MAXN = 100100;int n;struct Node{ LL w, s;}t[MAXN];bool cmp(const Node a,
阅读全文
posted @
2012-09-16 17:35
找回失去的
阅读(1278)
推荐(0)
HDU 4282 A very hard mathematic problem
摘要:枚举 + 二分,代码写得挫!#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>typedef __int64 LL;LL x, y, z, D, S;LL k;int main(){ int i, j; while(scanf("%I64d", &k), k) { S = 0; for(D = 1; D < k / 2; D <<= 1, S ++); bool flag1, flag2; LL a, b,
阅读全文
posted @
2012-09-15 11:06
找回失去的
阅读(238)
推荐(0)
HDU 3415 Max Sum of Max-K-sub-sequence
摘要:题目给出的是一个环状的序列,所以可以在序列后面复制前k个数字。如果用sum[i]来表示复制过后的序列的前i个数的和,那么任意一个子序列[i..j]的和就等于s[j]-s[i-1]。对于每一个j,用s[j]减去最小的一个s[i](i>=j-k+1)就可以得到以j为终点长度不大于k的和最大的序列了。将原问题转化为这样一个问题后,就可以用单调队列解决了。单调队列确实是一种很实用的结构,本题中保持单调递增,队首元素就是我们需要的那个最小元素,保证待插入的j-1位置对应的sum值要大于队尾元素。#include <stdio.h>#include <string.h>#in
阅读全文
posted @
2012-09-12 09:56
找回失去的
阅读(236)
推荐(0)
HDU 4268 Alice and Bob
摘要:这是昨天网络赛的1002题,做得很伤感。昨天处理的方法上有些错误,一直没有过。今天学习了下set,STL真强大。将Alice的card标记为id=0,Bob的card标记为1。将所有的纸片按照h,w的升序排序,按照id的降序排序,也就是在相同情况下将Bob的纸片放前面。然后将Bob的纸片的w插入set,贪心选取Alice比Bob的纸片w大一点的来覆盖,然后删掉被覆盖的纸片。#include <stdio.h>#include <string.h>#include <algorithm>#include <set>using namespace s
阅读全文
posted @
2012-09-09 10:37
找回失去的
阅读(754)
推荐(0)