列表

详情


MT40. 关灯游戏

描述

在 Alice 生日的那天, Bob 送给了她 n 个灯泡。他们决定用这些灯泡玩一个游戏:他们把这些灯泡从左往右排成一行,在初始时,有些灯泡是点亮的,有些灯泡是熄灭的。接下来,他们轮流进行操作,Alice 首先操作。在每一次操作中,轮到操作的人需要选择一个点亮的灯泡,然后把它以及它右边的所有灯泡的状态进行一次改变,即把点亮的灯泡熄灭,把熄灭的灯泡点亮。如果在某一个人操作完之后,所有的灯泡都变成了熄灭状态,那么那个人就赢得了游戏。 Alice 和 Bob 都想赢得游戏,在他们都足够聪明的情况下,最后谁会赢呢?

数据范围: , 输入只包含 0 和 1

输入描述

第一行包含一个整数 ,表示灯泡的个数。

第二行包含 个 0 或 1,表示初始时灯泡的状态,0 表示熄灭,1 表示点亮。

输出描述

如果最后Alice能赢,输出Alice,或则输出Bob。

示例1

输入:

3
0 1 1

输出:

Alice

示例2

输入:

5
1 1 1 0 0

输出:

Bob

原站题解

C++ 解法, 执行用时: 4ms, 内存消耗: 380KB, 提交时间: 2020-10-29

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <deque>                //双向队列;
#include <cmath>
#include <set>
#include <stack>
#include <map>
#include <vector>
#include <cstdlib>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int maxn=1e3+5;
const int maxm=2e6+5;
const ll mod=1e9+7;
const int INF=1e8;
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
template<class T>
void read(T &ret){              //快速输入模版;
    ret=0;
    int f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        ret=ret*10+c-'0';
        c=getchar();
    }
    ret*=f;
}
      
      
int main()
{
    int n;
    scanf("%d",&n);
    int x;
    for(int i=1;i<=n;i++){
        read(x);
        if(i==n){
            if(x){
                cout<<"Alice"<<endl;
            }else{
                cout<<"Bob"<<endl;
            }
        }
    }
    return 0;
}

C++ 解法, 执行用时: 4ms, 内存消耗: 412KB, 提交时间: 2020-10-29

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <deque>                //双向队列;
#include <cmath>
#include <set>
#include <stack>
#include <map>
#include <vector>
#include <cstdlib>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int maxn=1e3+5;
const int maxm=2e6+5;
const ll mod=1e9+7;
const int INF=1e8;
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
template<class T>
void read(T &ret){              //快速输入模版;
    ret=0;
    int f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        ret=ret*10+c-'0';
        c=getchar();
    }
    ret*=f;
}
      
      
int main()
{
    int n;
    scanf("%d",&n);
    int x;
    for(int i=1;i<=n;i++){
        read(x);
        if(i==n){
            if(x){
                cout<<"Alice"<<endl;
            }else{
                cout<<"Bob"<<endl;
            }
        }
    }
    return 0;
}

上一题