zoukankan      html  css  js  c++  java
  • 美团校招的算法题:灯泡游戏

    我的思想是这样的:

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

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

    她俩一人选一次,所以组后执行次数如果是偶数就是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;
    }
  • 相关阅读:
    表格维护:弹出
    表格联动
    表单查询
    浅谈分治 —— 洛谷P1228 地毯填补问题 题解
    The Captain 题解
    网课集训记
    2020-1-20寒假集训记
    博客使用声明
    JZOJ P5829 string 线段树
    线段树--CF438D The Child and Sequence
  • 原文地址:https://www.cnblogs.com/Lin-Yi/p/7523006.html
Copyright © 2011-2022 走看看