标签:
...
8.1
忘记在干嘛了..好像补了弱鸡赢第一场的题
8.2
不会做多校..水题也不会..什么都不会
8.3
补多校,做了个弱鸡赢,还没补
8.4
依然是什么都不会的多校
好菜.....
8.5
巴什博奕
一堆 n 个石子,两个人轮流取,每次取 x 个(1<= x <= m)
n = (m+1) 是必败状态
所以 对于 一般 的 n = k*(m+1) + r ,只要 每次 把石头 取成 (m+1)的倍数 转移给对方,自己就可以赢了
想起当时司老大 讲的时候,说,你就把(m+1)的倍数留给对方,你就肯定赢了
当时还觉得这样 好毒啊...
诶...过这么久还不会博弈...真是对不起司老大
hdu 1846 Brave Game
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 int n,m; 7 8 int main(){ 9 int T; 10 scanf("%d",&T); 11 while(T--){ 12 scanf("%d %d",&n,&m); 13 if(n%(m+1) == 0) puts("second"); 14 else puts("first"); 15 } 16 return 0; 17 }
威佐夫博弈
两堆石头,两个人轮流取,每次操作 可以取走其中一堆的任意数目的石头,或者 取走两堆石头的相同数目
必败 状态 为 (ak,bk)
1.bk = ak + k
2.double phi = (1+sqrt(5))/2 (黄金分割率)
ak = floor(k*phi) bk = floor(k*k*phi)
hdu 1527 取石子游戏
n,m 太大,打表打不下,用差值来判断
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <map> 6 #include <cmath> 7 using namespace std; 8 int n,m; 9 10 map<int,map<int,int> > h; 11 12 int main(){ 13 double phi = (1.0+sqrt(5.0))/2.0; 14 while(scanf("%d %d",&n,&m) != EOF){ 15 if(n > m) swap(n,m); 16 int l = floor((m-n)*phi); 17 if(l == n) puts("0"); 18 else puts("1"); 19 } 20 return 0; 21 }
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/5739806.html