2021牛客寒假算法基础集训营3 J.加法和乘法(博弈)

J.加法和乘法

题目链接:https://ac.nowcoder.com/acm/contest/9983/J

题目描述:

有一天牛牛和牛妹在做游戏,规则如下:
桌面上摆着n张纸牌,每张纸牌上写着一个正整数,由牛牛先手轮流执行以下操作:
1.如果桌面上只剩一张纸牌,游戏结束,这张纸牌上的数字如果是奇数则牛牛胜利,反之牛妹胜利。
2.当前行动玩家选择两张纸牌,设上面的数字分别为X,Y,接下来玩家从加法和乘法中选择一个并应用到这两个数字上,得到结果为Z,接下来将选择的两张纸牌丢弃,并拿一张新的纸牌放到桌面上,在上面写Z。
假设双方均以最优策略行动,最后谁会赢?

输入描述:

第一行一个正整数n,代表开始的纸牌数。
第二行n个空格分隔的正整数ai代表开始纸牌上的数字。
1 ≤ n≤ 10^6
1 ≤ ai ​≤10^9

输出描述:

如果牛牛能赢,输出NiuNiu,否则输出NiuMei。

示例1:

输入
3
233 2333 23333
输出
NiuMei

示例2:

输入
4
1 1 1 1
输出
NiuNiu

解题思路:

博弈题
n = 1时,如果是奇数则牛牛赢,是偶数则牛妹赢。
n > 1时,若最后一次操作是牛妹(后手),则牛妹赢。因为无论何种情况一定可以生成两个偶数。(若都为奇数则奇数+奇数=偶数,若存在偶数,做乘法还是得到偶数)。
若初始时最多一个偶数,则牛牛(先手)的操作可以全部变为奇数,而牛妹(后手)最多产生一个偶数,因此最多只有一个偶数,牛牛(先手)赢。
若初始时有两个以上的偶数,则牛妹(后手)操作时,一定存在至少两个偶数,因此最终牛妹(后手)赢。

代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
    
    
	int n,cnt=0;
	cin>>n;
	int a[1000010]={
    
    0};
	for(int i=1;i<=n;i++){
    
    
		cin>>a[i];
		if(a[i]%2==0)
			cnt++;
	}
	if(n==1){
    
    
		if(a[1]&1)
			cout<<"NiuNiu"<<endl;
		else
			cout<<"NiuMei"<<endl;
		return 0;
	}
	if((n&1)||cnt>=2){
    
    
		cout<<"NiuMei"<<endl;
		return 0;
	}
	cout<<"NiuNiu"<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45894701/article/details/113703249