#UVa:305-Joseph

灆洢 2015-05-13 10:17:28

照著模擬砍的過程,去察覺若有某個m能夠讓砍掉前一半的人都在後半部的話就是答案。可以先將答案算出來並儲存起來,這樣可以加速重複要答案的部分。

C++(0.309)

/*******************************************************/
/* UVa 305 Joseph                                      */
/* Author: Maplewing [at] knightzone.studio            */
/* Version: 2015/05/13                                 */
/*******************************************************/
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
  int mem[15] = {0};
  for( int i = 1 ; i <= 14 ; ++i ){
    int m = i + 1;
    while( true ){
      int k = i * 2;

      int killPerson = -1;
      while( k > i ){
        killPerson += m;
        killPerson %= k;
        if( killPerson < i ){
          break;
        }
        --k;
        --killPerson;
      }

      if( k <= i ){
        mem[i] = m;
        break;
      }

      ++m;
    }
  }

  int k;
  while( scanf("%d", &k) != EOF && k != 0 ){
    printf("%d\n", mem[k]);
  }

  return 0;
}

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料