日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sdut——4541:小志志和小峰峰的日常(取石子博弈模板题 4合1)

發(fā)布時(shí)間:2023/12/20 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sdut——4541:小志志和小峰峰的日常(取石子博弈模板题 4合1) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

小志志和小峰峰的日常

Time Limit:?1000 ms?Memory Limit:?65536 KiB

Problem 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 8

Sample 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。