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;
}