NEUQ OJ 1233: 幸运儿

题目描述:

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)


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值