zoukankan      html  css  js  c++  java
  • Leetcode Elemination Game

    题目网址:https://leetcode.com/contest/2/problems/elimination-game/

    题意: 给定一个从1到n的数列,第一次从最左边开始,每隔一个淘汰一个数字。然后从剩下的数字中,最右边的数字开始,每隔一个淘汰一个数字。重复上述步骤,求最后剩下的那个数字。

    解析:是一个模拟题。只需要确定每趟淘汰赛开始时的数字即可(最后一个数字就是最后一趟淘汰赛的开始的数字)。

    假设第i趟开始的数字为start,此时等差数列的差(distance)为2^i,数字个数为n/(2^i)  (t)

    则最后一个删除的数字与第一个删除的数字的差为distance*(t-1),且最后一个删除的数字与下一趟第一个删除的数字的差为distance/2.

    另外,需要注意的一点是,当n=2*k + 1时与 n-1 = 2*k,最后剩下的数字相同。代码如下:

        int lastRemaining(int n) {
           int ans = 1;
           int cnt = 0;
           int distance = 1;
           
           while(n > 1){
      
                 n /= 2;
                 cnt ++;
                 distance *= 2;
                 if(cnt&1){
                      ans += distance*(n-1) + distance/2;
                 }
                 else{
                      ans -= distance*(n-1) + distance/2;
                 }
          }      
           return ans;  
        }
    

      

  • 相关阅读:
    【C++】<bits/stdc++.h>
    【网易】被3整除
    【TCP/IP详解】UDP:用户数据报协议
    【网易】牛牛找工作
    【C++】<numeric>中iota函数:递增序列填充

    今天好像找到C语言延迟输出的原因了
    C语言第2
    c语言新知
    glade No package 'libxml-2.0' found
  • 原文地址:https://www.cnblogs.com/castlehappiness/p/5818794.html
Copyright © 2011-2022 走看看