sdut——4541:小志志和小峰峰的日常(取石子博弈模板题 4合1)
小志志和小峰峰的日常
Time Limit:?1000 ms?Memory Limit:?65536 KiBProblem Description
小志志和小峰峰特別喜歡一起討論一些很好玩的問題。?
小志志發(fā)現(xiàn)一個(gè)有趣的游戲,馬上和小峰峰進(jìn)行了分享。?
有 n 堆石子堆,每堆石子個(gè)數(shù)為 a[i]。?
到小志志的回合:小志志可以選取其中的一堆,拿至少 1 個(gè)最多 x 個(gè)石子。?
到小峰峰的回合:小峰峰可以選取其中的一堆,拿至少 1 個(gè)最多 y 個(gè)石子。?
小志志先手,回合交替進(jìn)行,到該玩家回合如果無法操作,該玩家輸。?
?
Input
輸入一個(gè) T,總共有 T 組測試數(shù)據(jù)。?
每組測試數(shù)據(jù):?
第一行輸入 n 代表有 n 堆石子堆。?
第二行輸入 n 堆石子堆分別的數(shù)量。?
第三行輸入兩個(gè)用空格隔開的 x, y 分別代表小志志和小峰峰對于一堆石子最多能拿的數(shù)量。?
(1 <= n <= 1e5, 1 <= a[i], x, y <= 1e9)
Output
小志志贏輸出 “xzz”,小峰峰贏輸出 “xff”,答案不包含 “”。
Sample Input
3 1 3 2 2 2 4 7 4 5 3 3 4 7 8 8Sample Output
xff xzz xff題解:
我們需要分類討論:
x == y 的時(shí)候:經(jīng)典的 sg
x != y 的時(shí)候:
任意的 a[i] <= min(x, y):Nim 博弈
否則至少存在一堆 a[i] > min(x, y):
如果 x > y:
我們把先手能拿的石子個(gè)數(shù)看成 y 的話,就是經(jīng)典的 sg,如果亦或和不是 0 那么先手必
勝。
如果亦或和是 0,那么先手可以選擇石子個(gè)數(shù)大于 y 的堆,拿掉 y+1 的石子個(gè)數(shù)。這樣對
于對方而言亦或和還是 0。所以先手必勝。
所以無論如何:先手必勝
如果 x < y:
如果石子堆個(gè)數(shù) > min(x, y) 的堆數(shù)大于 2:后手必勝,先手無論如何處理都會變成上述的
情況。
如果石子堆個(gè)數(shù) > min(x, y) 的堆數(shù) == 1:
先手肯定會選擇 > min(x, y) 的石子堆進(jìn)行操作,不然先手必?cái) ?/strong>
設(shè)這堆石子個(gè)數(shù)為 t,除去這堆石子的亦或和為 ans,你只有將這堆石子個(gè)數(shù)變成 ans &&
ans <= x 才能贏。
所以 t-x <= ans && ans <= x 先手必勝。
否則先手必?cái) ?/strong>
?
#include<bits/stdc++.h> #define ll long long using namespace std; const int N = 1e5+5; string s[2]; ll n, x, y, T; ll arr[N];bool f1(ll ans){for(int i = 1; i <= n; i++)ans ^= arr[i]%(x+1);return ans != 0; }int main() {s[1] = "xzz", s[0] = "xff";cin >> T;while(T--){cin >> n;for(int i = 1; i <= n; i++) cin >> arr[i];cin >> x >> y;if(x == y) cout << s[f1(0)] << endl; //經(jīng)典sgelse{int flag = 0, ans = 0;for(int i = 1; i <= n; i++){ans ^= arr[i];if(arr[i] > min(x, y))flag++;}if(!flag){ // Nim博弈if(ans) cout << s[1] << endl;else cout << s[0] << endl;}else{if(x > y) cout << s[1] << endl;else{if(flag > 1) cout << s[0] << endl;else{int t;for(int i = 1; i <= n; i++){if(arr[i] > min(x, y)){t = arr[i];ans ^= arr[i];break;}}if(t - ans <= x && ans <= x)cout << s[1] << endl;else cout << s[0] << endl;}}}}}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/philo-zhou/p/11391233.html
總結(jié)
以上是生活随笔為你收集整理的sdut——4541:小志志和小峰峰的日常(取石子博弈模板题 4合1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浪潮之巅--摩托罗拉
- 下一篇: 多人合作开发项目时出现的问题总结