eg1.
拿石頭,一共有n個石頭alice和bob每人每回合可以拿1~m - 1個石頭最後乙個拿石頭的人獲勝。
n =1 / 2 / 3 先手勝
4 後手勝
5 / 6 / 7 先手勝
8 後手勝
9 / 10 / 11 先手
n % m == 0 後手勝 n % m != 0 先手勝
例題:hdu1846
#include using namespace std;
int c, n, m;
int main()
return 0;
}
eg2.
alice和bob在下棋,一開始在(1,1)點每人每次可以向下,向右,向右下走一步,誰先走到(n,m)點誰就贏了。
必敗態:
n = 1, m = 1; n = 3, m = 3;
如果n和m都是奇數,後手勝,否則先手勝
例題:hdu2147
#include using namespace std;
int n, m;
int main()
return 0;
}
eg1.
有一堆個數為n的石子,遊戲雙方輪流取石子,滿足:
1)先手不能在第一次把所有的子取完;
2)之後每次可以取的石子數介於1到對手剛取的石子數的2倍之間(包含1和對手剛取的石子數的2倍)。
必敗態:n是斐波那契數列
必勝態:n不是
zeckendort定理(齊肯多夫定理):任何正整數可以表示為若千個不連續的fibonacci數之和。
例題:hdu2516
#include using namespace std;
int n;
setst;
int fib[50];
int main()
while(cin >> n && n)
return 0;
}
有兩堆各若干個物品,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品,規定每次至少取乙個,多
者不限,最後取光者得獲勝。
結論:首先**比例:r=1.618 = (sqrt(5.0) + 1) / 2,則給定兩組石頭堆(n,m),假設n>m,則當(n-m)*r==m時,先手輸。否則後手輸
*補充:floor函式
1、函式原型:
1 double floor (double x );
2 float floor (float x );
3 long double floor ( long double x );
2、功能:返回乙個小於傳入引數的最大整數
3、引數:x為將來被處理的數
4、返回值:返回不大於x的最大整數
(所以說這玩意跟(int)強制型別轉換基本一樣)
例題:hdu1527
#include using namespace std;
int a, b, t;
double r, c;
int main()
return 0;
}
有n堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。
必敗態(奇異局勢):所有堆石子數異或和為0
如何將乙個非奇異局勢(異或和不為0)轉化為奇異局勢?
以三堆石子為例(a,b,c)(a 例題:hdu1850
#include using namespace std;
int m;
int ar[105];
int ans, sum, k;
int main()
if(ans == 0) cout << 0 << '\n';
else
cout << sum << '\n';}}
return 0;
}
還有乙個叫sg函式的東東~~
(待更新)
博弈論入門
博弈論 是二人或多人在平等的對局中各自利用對方的策略變換自己的對抗策略,達到取勝目標的理論。博弈論是研究互動決策的理論。博弈可以分析自己與對手的利弊關係,從而確立自己在博弈中的優勢,因此有不少博弈理論,可以幫助對弈者分析局勢,從而採取相應策略,最終達到取勝的目的。一.bash博弈 問題 只有一堆n個...
博弈論入門
參考 三個簡單的博弈論問題 博弈 1066 bash遊戲 原題傳送 有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次最少拿1顆,最多拿k顆,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n和k,問最後誰能贏得比賽。例如n 3,k 2。無論a如何拿,b都可以拿到最...
博弈論入門
什麼是博弈 通俗地講,博弈就是指遊戲中的一種選擇策略的研究。博弈的英文為 game 我們一般將它翻譯成 遊戲 而在英語中,game 的意義不同於漢語中的遊戲,它是人們遵循一定規則的活動,進行活動的人的目的是讓自己 贏 我們在和對手競賽或遊戲的時候怎樣使自己贏呢?這不但要考慮自己的策略,還要考慮其他人...