题目描述:
n 个人围成一圈, 并依次编号1~n,。从编号为1 的人开始,按顺时针方向每隔一人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿。如果你想成为最后两个幸运儿,请问开始时应该站在什么位置?(设3<=n<=50)
输入:
有多个测试序列。每行是开始时的人数n
输出:
第1 行是选出顺序,第2 行是两名幸运儿的开始位置(按升序排列),位置编号之间用一个空格分开。
样例输入
12 20 45
样例输出
2 4 6 8 10 12 3 7 11 5 1 9 2 4 6 8 10 12 14 16 18 20 3 7 11 15 19 5 13 9 1 17 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 3 7 11 15 19 23 27 31 35 39 43 5 13 21 29 37 45 9 25 41 17 1 33
这题和约瑟夫环有一点点不同,注意在到起始位置的时候,计数的变量需要重新置为0!
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)!=EOF){
vector <int> v;
for(int i=1;i<=n;i++){
v.push_back(i);
}
int i=0, ct=0;
while(v.size()>2){
ct++;
if(ct==2){
printf("%d ",v[i]);
v.erase(v.begin() + i);
ct=0;
}
else{
i =(++i)%v.size();
if(i==0){
ct=0;
}
}
}
printf("\n");
printf("%d %d\n",v[0],v[1]);
}
return 0;
}
欢迎大家加入 早起学习群,一起学习一起进步!(群号:642179511)