【牛客 - 373A】翻硬币问题(博弈,结论,分析)
題干:
鏈接:https://ac.nowcoder.com/acm/contest/373/A
來源:牛客網
?
Alice和Bob正在玩一個很經典的游戲。
有?n?n個硬幣初始時全部正面朝上,每一輪Alice必須選擇其中任意的恰好?m?m枚硬幣并將它們全部翻轉,如果若干輪翻轉后所有硬幣全部反面朝上,那么Alice就贏得了游戲。
假設我們認為每枚硬幣只有正面朝上和反面朝上兩種狀態且只考慮?m?m為偶數的情況,問題會比較簡單。
但是出題人希望這道題更毒瘤一些,所以他增加了一條規則:Bob在整個游戲中可以有一次機會使壞--在Alice某一輪翻轉完之后,偷偷選擇任意一枚硬幣并將它翻轉。
為了不讓Alice贏得游戲,Bob會采取最優的策略。
現在給定?n?n和?m?m,請問Alice是否可以贏得游戲?
注意:
輸入描述:
每個輸入文件有多個測試樣例。
第一行一個整數?T(T≤30000)?T(T≤30000)--測試樣例個數。
然后?T?T行,每行兩個整數?n?n和?m?m?(1≤m≤n≤109,m是偶數)?(1≤m≤n≤109,m是偶數)--硬幣的數量和每一輪翻轉硬幣的數量。其中第?i+1?i+1行表示第?i?i個樣例。
輸出描述:
輸出?T?T行,第?i?i行輸出第?i?i個測試樣例的答案。
如果Alice可以贏得游戲輸出“Yes”,否則輸出“No”,請注意區分大小寫。
示例1
輸入
復制
2 2 2 8 6輸出
復制
Yes No說明
對于第一個樣例,Alice直接一輪翻轉全部兩個硬幣就可以贏得游戲。對于第二個樣例,Bob如果在第一輪結束后將任意一枚反面朝上的硬幣翻轉,之后Alice無論怎樣翻轉硬幣也永遠不能使得所有硬幣全部反面朝上。解題報告:
? ?如果要贏,只能第一次就翻出結果來,否則就輸。作者:lililalala
證明:
一回合不能直接翻轉所有硬幣,因為m是偶數,所以只需要討論n的奇偶性。
(1)n是奇數
某回合結束后所有硬幣反面朝上可以等價于所有硬幣都被翻轉了奇數次。假設可以達成,那么
該回合后所有回合總翻轉次數一定要為奇數(因為奇數個奇數相加是奇數)
然而m是偶數,即使在不使壞的情況下,無論翻轉多少個回合,總翻轉次數也一定是偶數,
所以在這種情況下是不可能贏得游戲的.答案是No
(2)n是偶數
同理,完成時所有硬幣都一定要被翻轉了奇數次,但是n是偶數,所以總翻轉次數一定要為偶
數,在不被使壞的情況下,至少有可能完成,但是除去n=m的情況外,只要在第一回合后立即
被使壞,不管翻轉哪一個硬幣,都會使得總翻轉次數由總是偶數變成總是奇數,和n為奇數
時原理相同,也不可能贏得游戲,答案是No
結論: n=m時答案是Yes,否則答案是No
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair using namespace std; ll n,m; int main() {int t;cin>>t;while(t--) {scanf("%lld%lld",&n,&m);if(n == m) puts("Yes");else puts("No");}return 0 ;}?
總結
以上是生活随笔為你收集整理的【牛客 - 373A】翻硬币问题(博弈,结论,分析)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【HDU - 4417】Super Ma
- 下一篇: 【BZOJ - 1059】矩阵游戏(二分