藍橋杯試題 算法提高 書院主持人

書院主持人

問題描述
  北大附中書院有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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章