题目网址: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;  
    }

  

posted on 2016-08-29 17:16  fqbrighter  阅读(242)  评论(0编辑  收藏  举报