列表

详情


NC206656. 赌上信仰的博弈!

描述

越来越接近期末了,Mike和Bob在实验室愉快地复习功课。突然,两人心血来潮,想要体会划水的快乐。Mike想要用投影仪大屏看柯南,体验影院式享受;而Bob想要大屏玩崩坏3,提验前所未有的沉浸感。为了让他们公平竞争使用投影仪的权利,Alice想出了一个游戏,让Mike与Bob一较高下。
Alice在桌面上摆了n堆棋子,第i堆里有a_i枚棋子,他们两人可以对棋子进行如下三种操作:

两人交替进行操作,且每次只能进行一次操作;当轮到某人进行操作,但没有可以执行的操作时,则该人为负,数据保证所有棋子可以取完。
因为Bob经常与Alice愉快地玩耍,所以Alice总是偏心地让Bob先手。Mike和Bob都很聪明,所以他们都会积极竞争。
请问,你能判断出最终谁会胜利吗?

输入描述

第一行一个正整数T()。
接下来T组数据,对于每组数据:
- 第一行,输入一个正整数n ()。
- 第二行,输入n个正整数a_i (),数据保证
数据保证

输出描述

一行输出,若Mike取胜,则输出"Mike";反之,则输出"Bob"。

示例1

输入:

2
2
1 1
2
2 2

输出:

Bob
Mike

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 225ms, 内存消耗: 888K, 提交时间: 2020-05-24 16:21:00

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<stack>
#define LL long long
using namespace std;
LL t;
LL n,tot,tt,drs;
LL x;
LL ans[3];
int read()
{
	int _=0,__=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-')__=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){_=_*10+ch-'0';ch=getchar();}
	return _*__;
}
int main()
{
    std::ios::sync_with_stdio(false);
    cin>>t;
    while(t--)
    {
    	cin>>n;tot=0;tt=0;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>x;
    		ans[i%2]+=x;
    		tot+=x;
		}
		tot/=2;
		tot%=2;
		drs=n%2;
		if(tot==1)
		cout<<"Bob"<<endl;
		else
		{
			if(drs==0) tt=ans[1]%2;
			else tt=ans[0]%2;
			if(tt==1)
			cout<<"Bob"<<endl;
			else
			cout<<"Mike"<<endl;
		}
		memset(ans,0,sizeof(ans));
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 334ms, 内存消耗: 996K, 提交时间: 2020-05-24 16:35:48

#include<iostream>
using namespace std;
long long t,n,a[2100000],ant,ans;
int main(){
	cin>>t;
	while(t--){
		ant=0,ans=0;
		cin>>n;
		for(int i=1;i<=n;i++){
		cin>>a[i];
		ant+=1LL*a[i]*(n-i);
		ans+=1LL*a[i];	
		} 
		ans=ans/2;
		if((ant%2==0)&&(ans%2==0)){
			cout<<"Mike"<<endl;
		}else{
			cout<<"Bob"<<endl;
		}
	}
}

上一题