1. 程式人生 > >小米OJ #67【開始報數 約瑟夫環問題】

小米OJ #67【開始報數 約瑟夫環問題】

描述

有 500 個小孩圍成一圈,編號從 1 到 500,從第一個開始報數:1,2,3,1,2,3,1,2,3,……每次報到 3 的小孩退出。問第 n 個被淘汰的小孩,在最開始 500 人裡是的編號是幾?

輸入

正整數 N,表示要計算的為第 N 個淘汰的小孩的編號,0 < N <= 500

輸出

第 N 個淘汰的小孩的編號

輸入樣例

1
2
206
311

輸出樣例

3
6
176
223

題解:佇列模擬。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
queue<int> q;
int main()
{
    int n, a[505];
    for(int i = 1; i <= 500; i++){
        q.push(i);
    }
    int cnt = 0, id = 1;
    while(!q.empty()){
        int t = q.front();
        q.pop();
        cnt++;
        if(cnt == 3){
            a[id++] = t;
            cnt = 0;
        }else q.push(t);
        if(id > 500) break;
    }
    while (cin >> n) {
       cout << a[n] << endl;
    }
    return 0;
}