POJ-1067 取石子游戲
阿新 • • 發佈:2018-12-10
題意: 給定兩堆石子, 有兩種取法: 1. 在其中任意一堆中去任意多石子 2. 在兩堆中取相同多石子 最少取一個石子, 不能取為敗。 分析:這道題是一個標準的威佐夫博弈, 對於為一個狀態(a, b)如果他滿足 (a, b)組成的矩形為黃金矩形那麼先手的人就必輸。 組成黃金矩形,那麼他的長寬比應該為(b為長, a為寬)
(a / (b - a)) = (1 + sqrt(5)) / 2
程式碼:
#include <iostream> #include <cstdio> #include <cmath> using namespace std; //威佐夫博弈 int main () { int a, b; while (cin >> a >> b) { if (a > b) swap(a, b); int k = b - a; double x = (int)(k*(sqrt(5.0) + 1) / 2.0); if (a == x) { cout << "0" << "\n"; } else { cout << "1" << "\n"; } } return 0; }