美团校招的算法题:灯泡游戏

我的思想是这样的:

要求是全灭了 就赢了。。那最左边如果有亮的 早晚都要解决。

我想 从左到右解决。选择第一个亮的,然后其他反过来。再选择第二个亮的其他反过来。

她俩一人选一次,所以组后执行次数如果是偶数就是bob赢了 如果是奇数就是alice赢了。

为了降低时间复杂度,我考虑:

第一次选择第一个1的灯泡,右侧1全变成0,0全变1,

如果我不改变右侧,那就相当于 选择了第一个1的灯泡之后,,我应该往右找第一个是0的灯泡(这个灯泡如果上一步选择之后 应该变成1,但是我没有改变他)

于是形成一个规律:如果上一次找1的灯泡,这次应该找0的灯泡

    如果上一次找0的灯泡,这一次应该找1的灯泡。

这样本来n方的时间复杂度能降为n

我的代码:

#include "iostream"
using namespace std;
// 获得数字位数
    int a[100000];
int main(){
    int n;
    cin>>n;
    for(int i =0;i<n;i++){
        cin>>a[i];
    }

    int res = 0;
    int k = 1;
    for(int i =0;i<n;i++){
        if(a[i]==k){
            res++;
            if(k==1) k=0;
            else k=1;
        }
    }
    if(res%2==0){
        cout<<"Bob";
    }else{
        cout<<"Alice";
    }

    return 0;
}
原文地址:https://www.cnblogs.com/Lin-Yi/p/7523006.html