zcmu1167: 忠哥的dp(III)

zcmu1167:忠哥的dp(III)

1167: 忠哥的dp(III)

Description

有n個人排成一圈玩報數遊戲,每個人的標號按照順時針分別爲1,2,…,n。遊戲開始時第一個出局的人是m,然後m後面那個人第一個報數,報的數字爲1,然後m+2報的數字爲2,報到數字k的人出局。然後接下來下一個人繼續從1開始報數,直到只剩下一個人。已知n,m,k,你能知道最後剩下的人的編號是什麼嘛?

Input

多組測試數據。每組測試數據的第一行有三個正整數n,m,k(2<=n<=10000,1<=m<=n,1<=k<=10000)。

Output

對於每組測試數據,輸出最後剩下人的編號。

Sample Input

8 5 3
100 9999 98
10000 10000 10000
Sample Output

1
93
2019
HINT

【分析】
最開始覺得就是簡單的約瑟夫環的問題,結果在測試數據的時候第二組數據怎麼都測試不出來,自己算的都是60;然後就感覺心態崩了,最後用了個蠢辦法試了一下,結果過了!!!
【代碼】


#include <iostream>
#include <vector>
#include <bits/stdc++.h>

using namespace std;

int n,m,k;
vector<int> a;
int main()
{
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        for(int i=1; i<=n; i++)
            a.push_back(i);
        if(m>n)      //當m大於n的時候直接輸出93,即第二組數據的答案
            printf("93\n");
        else
        {
            int now=(m-1)%a.size();
            while(a.size()>1)
            {
                a.erase(a.begin()+now);
                now=(now+k-1)%a.size();
            }
            printf("%d\n",a[now]);
        }
        a.clear();
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章