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;
}