書院主持人
問題描述
北大附中書院有m個同學,他們每次都很民主地決策很多事情。按羅伯特議事規則,需要一個主持人。同學們民主意識強,積極性高,都想做主持人,當然主持人只有一人。爲了選出主持人,他們想到了一個辦法並認爲很民主。方法是:
大家圍成一圈,從1到m爲每個同學編號。然後從1開始報數, 數到n的出局。剩下的同學從下位開始再從1開始報數。最後剩下來的就是主持人了。現在已經把同學從1到m編號,並約定報數爲n的出局,請編程計算一下,哪個編號的同學將會成爲主持人。
輸入格式:
一行,由空格分開的兩個整數m n。
輸出格式:
一個整數,表示主持人的編號
輸入樣例1:
15 3
輸出樣例1:
5
輸入樣例2:
200 55
輸出樣例2:
93
方法一:
1、 用vector容器存儲數據。
2、循環m-1次,刪除相應的數據。
3、將最後一個數據輸出。
代碼如下:
#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
int m,n;
int main(){
cin>>m>>n;
for(int i=0;i<m;i++){
v.push_back(i+1);
}
for(int i=1,k=0;i<m;i++){
k = (k+n-1)%v.size();
v.erase(v.begin()+k);
}
cout<<v[0]<<endl;
return 0;
}
方法二:
在尋找其他解法的過程中,發現這道題原來是著名的約瑟夫環問題,用一行代碼就可以解決(牛逼)。
代碼如下:
#include<iostream>
using namespace std;
int m,n;
int f(int n, int m){
return n == 1 ? n : (f(n - 1, m) + m - 1) % n + 1;
}
int main(){
cin>>m>>n;
cout<<f(m,n)<<endl;
return 0;
}