好一道博弈论水题
题目大意:
给定长度为 $ n $ 的数列 $ a_1, a_2, \dots, a_n $,两名玩家 Alice 、 Bob 依次以最优策略从数列中取走一个数,Alice 先取,直至为空博弈结束。若 Alice 取走的所有数之和为偶,Alice 胜利;若 Alice 取走的所有数之和为奇,Bob 胜利。输入给定序列,请输出必胜玩家。
解法:
推公式:
共识:奇数+奇数=偶数,奇数+偶数=奇数,偶数+偶数=偶数。
统计序列 $ a $ 中偶数 $ a_i $ 和奇数 $ a_i $ 分别出现的次数 $ e $、$ o $,依次可确定下列几种情况,决定二人胜负态:
- 当 $ o\mod 4 = 2 $ 时, Bob 存在必胜态:
Bob 仅需保证每次所取数字与 Alice 所取数字奇偶性相同即可,这样可以使二者取走的奇数个数相同。若在此过程中 Alice 取走了最后一个偶数,奇数必然剩余偶个。随后,Alice 和 Bob 各自将选择剩余奇数的一半。最后,Alice 和 Bob 都拥有 $ \frac{o}{2} $个奇数,Alice 和为奇数,Alice 败。
- 当 $ o\mod 4 = 3 $ 时, Alice 存在必胜态:
Alice 首先选择一个奇数,若 Bob 能从剩下的数字中取走偶个奇数,则 Bob 胜。从情况 $ 1 $ 中可知,Bob 必败。
- 当 $ o\mod 4 = 0 $ 时, Alice 存在必胜态:
Alice 首先选择一个偶数,在随后的操作中,Alice 仅需保证每次所取数字与 Bob 所取数字奇偶性相同即可,这样可以使二者取走的奇数个数相同。若在此过程中偶数被取完,奇数必然剩余偶个。随后,Alice 和 Bob 各自将选择剩余奇数的一半。最后,Alice 和 Bob 都拥有 $ \frac{o}{2} $ 个奇数,Alice 和为偶数,Alice 胜。
- 当 $ o\mod 4 = 1 $ 时,先选择奇数的人败:
先选择奇数的人将会导致对手出现情况 3,对手必胜。博弈开始时,如果 $ e $ 为偶即 $ e\mod 2 = 0 $,则 Bob 将会取走最后一个偶数,Alice 败,$ e $ 为奇即 $ e\mod 2 = 1 $,则 Alice 胜。
注意:由于有多组数据,记得清空!我就因为没清空WA了第一个点。
附源码:
#include<bits/stdc++.h>
using namespace std;
int t,n,x,cnt1,cnt2;
bool flag;
int main(){
cin>>t;
while(t--){
cin>>n;
cnt1=0;//多则不清空,提交两行泪
cnt2=0;
for(int i=1;i<=n;i++){
cin>>x;
if(x%2==1){//判断奇偶
cnt1++;//奇数
}
else{
cnt2++;//偶数
}
}
flag=0;//多则不清空,提交两行泪
if(cnt1%4==2){//情况一
flag=0;//
}
else if(cnt1%4==3){//情况二
flag=1;//
}
else if(cnt1%4==0){//情况三
flag=1;//
}
else if(cnt2%2==1){//情况四
flag=1;//
}
cout<<(flag?"Alice":"Bob")<<endl;//1为Alice必胜,反之Bob胜
}
return 0;//A了道黄题!
}
标签:洛谷,CF1738C,奇数,题解,Alice,偶数,flag,Bob,mod
From: https://www.cnblogs.com/OIer-QAQ/p/17578331.html