博弈论-威佐夫博弈
1.威佐夫博弈的條件(1)人數為兩人(2)物品為兩堆,每一個人在取物品的時候要么在一堆中取若干物品,要么在兩堆中取相等的物品。每次至少一個,可以取完這一堆。(3)先手必敗的條件:在奇異局勢下必敗。
2.OK,如果你不是很懂什么叫做奇異局勢,那么聽我解釋。我們知道物品兩為兩堆,每一堆的數量數a,b。我們記作(a,b).假設在這個狀態下,先手是必敗的,那么這個狀態就叫做奇異局勢。比如(1,2).(3,5)等等。奇異局勢有著很重要的應用,也有著很優美的性質。
3.奇異局勢的性質:
(1).任何自然數都包含在一個且僅有一個的奇異局勢中。
證明:若(a[k],b[k])為一個奇異局勢,因為b[k]=a[k]+k,a[k]>a[k-1] ?=》 ?b[k] >a[k-1]+k >a[k-1]+k-1 =》 b[k-1] > a[k-1].
(2)任何操作都會將奇異局勢變成非奇異局勢
由性質1可知,即使是同時減少,兩個數的差值不變,所以不可能成為其他奇異局勢的差,因此也是非奇異局勢;
(3)可采用適當的方法將非奇異局勢變為奇異局勢,那么下一個必輸;
3.如何判斷一個局勢是否是奇異局勢呢?對于任意一個局勢(a,b).假設a<=b,c=b-a,這里引入一個參數:1.618.沒錯,看上去很熟悉,黃金分割。很多人在寫博客的時候寫道這里的時候都會驚嘆數學之美,原來一切練習的如此緊密,數學在生活中的每一個角落。如果a=c*1.618.那么這就是一個奇異的局勢,否則不是。那么下面就很簡單了。給出一個裸題。
威佐夫博弈。下面時AC的代碼:
#include<iostream> #include<algorithm> #pragma warning(disable:4996) using namespace std; int main() {int n, m;while (~scanf("%d%d", &n, &m)){int a = min(m, n);int b = max(m, n);int c = b - a;double r = (sqrt(5.0) + 1) / 2;int tem = (int)(r*c);if (a ==tem){cout << 0 << endl;}else{cout << 1 << endl;}}return 0; }?
總結
- 上一篇: js简易月份表
- 下一篇: html之一行代码给table设置标题