洛谷CF1738C题解

发布时间 2023-07-24 20:55:00作者: OIer_QAQ

好一道博弈论水题

题目传送门
更好的食用体验

题目大意:

给定长度为 $ n $ 的数列 $ a_1, a_2, \dots, a_n $,两名玩家 Alice 、 Bob 依次以最优策略从数列中取走一个数,Alice 先取,直至为空博弈结束。若 Alice 取走的所有数之和为偶,Alice 胜利;若 Alice 取走的所有数之和为奇,Bob 胜利。输入给定序列,请输出必胜玩家。

解法:

推公式:

共识:奇数+奇数=偶数,奇数+偶数=奇数,偶数+偶数=偶数。

统计序列 $ a $ 中偶数 $ a_i $ 和奇数 $ a_i $ 分别出现的次数 $ e $、$ o $,依次可确定下列几种情况,决定二人胜负态:

  1. 当 $ o\mod 4 = 2 $ 时, Bob 存在必胜态:

Bob 仅需保证每次所取数字与 Alice 所取数字奇偶性相同即可,这样可以使二者取走的奇数个数相同。若在此过程中 Alice 取走了最后一个偶数,奇数必然剩余偶个。随后,Alice 和 Bob 各自将选择剩余奇数的一半。最后,Alice 和 Bob 都拥有 $ \frac{o}{2} $个奇数,Alice 和为奇数,Alice 败。

  1. 当 $ o\mod 4 = 3 $ 时, Alice 存在必胜态:

Alice 首先选择一个奇数,若 Bob 能从剩下的数字中取走偶个奇数,则 Bob 胜。从情况 $ 1 $ 中可知,Bob 必败。

  1. 当 $ o\mod 4 = 0 $ 时, Alice 存在必胜态:

Alice 首先选择一个偶数,在随后的操作中,Alice 仅需保证每次所取数字与 Bob 所取数字奇偶性相同即可,这样可以使二者取走的奇数个数相同。若在此过程中偶数被取完,奇数必然剩余偶个。随后,Alice 和 Bob 各自将选择剩余奇数的一半。最后,Alice 和 Bob 都拥有 $ \frac{o}{2} $ 个奇数,Alice 和为偶数,Alice 胜。

  1. 当 $ 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了道黄题!
}