青少年编程知识记录 codecoming

【题解】幸运儿

【题目描述】

n 个人围成一圈, 并依次编号1~n,从编号为1 的人开始,按顺时针方向每隔一人选出一个,当一圈结束之后,剩下的人重新围成一圈,再次从编号1的人开始,如此循环直到剩下两人,这剩下的两人就是幸运儿。如果你想成为最后两个幸运儿,请问开始时应该站在什么位置?(设3<=n<=50)

【输入描述】

有多个测试序列。每行是开始时的人数n

【输出描述】

第1 行是选出顺序,第2 行是两名幸运儿的开始位置(按升序排列),位置编号之间用一个空格分开。

【样例输入】

12  20

【样例输出】

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



【参考答案】

#include<iostream>  #include<queue>  using namespace std;  int main(){      int n;      while(cin>>n){          queue<int> q;          for(int i=1;i<=n;i++){              q.push(i);          }          int k=1;          while(!q.empty()){              if(q.size()==2){                  break;              }              if(q.front()==1){                  k=1;              }              if(k==2){                  cout<<q.front()<<" ";                  q.pop();                  k=1;              }else{                  q.push(q.front());                  q.pop();                  k++;              }          }          cout<<endl;          int k1[2];          int i=0;          while(!q.empty()){              k1[i++]=q.front();              q.pop();          }          if(k1[0]>k1[1]){              cout<<k1[1]<<" "<<k1[0]<<endl;          }else{              cout<<k1[0]<<" "<<k1[1]<<endl;          }      }      return 0;  }



作者:亿万年的星光 分类:题解目录 浏览: