hdu1276 士兵队列训练问题(STL的list)


题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1276


题目描述:

某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。


Input

本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。


Output

共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。

扫描二维码关注公众号,回复: 10504473 查看本文章

Sample Input

2

20

40


Sample Output

1 7 19

1 19 37


 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN=5500;
 4 int main(){
 5     int n,m;
 6     cin>>n;
 7     while(n--){
 8         cin>>m;
 9         int k=2;
10         list<int> mylist;
11         list<int>::iterator it;
12         for(int i=1;i<=m;i++)
13             mylist.push_back(i);
14         while(mylist.size()>3){
15             int num=1;
16             for(it=mylist.begin();it!=mylist.end();){
17                 if(num++%k==0)
18                     it=mylist.erase(it);
19                 else
20                     it++;
21             }
22             k==2?k=3:k=2;
23         }
24         for(it=mylist.begin();it!=mylist.end();it++){
25             if(it!=mylist.begin())
26                 cout<<" ";
27             cout<<*it;
28         }
29         cout<<endl;
30     }
31     return 0;
32 }

猜你喜欢

转载自www.cnblogs.com/ZKYAAA/p/12637557.html