码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1276 士兵队列训练问题

时间:2015-07-20 21:14:41      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

Description

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

Input

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

Output

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

Sample Input

2 20 40
 

Sample Output

1 7 19 1 19 37
 

 思路:用链表模拟

 

#include"iostream"
#include"list"
using namespace std;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		cin>>n;
        list<int> s;
        if(n==0) cout<<0<<endl;
        else
        {
        for(int i=1;i<=n;i++)
			s.push_back(i);
        //cout<<s.size()<<endl;
		list<int>::iterator it,ip;
		int f=1;
		int flag=s.size();
		while(flag>3)
		{
            for(it=s.begin();it!=s.end();)
			{
             if(f==2)
			 {
			   f=1;
			   ip=it;
			   it++;
             s.erase(ip);
             flag--;
			 }
			 else
			 {
               f++;
               it++;
			 }
			}
			f=1;if(flag<=3) break;
            if(flag<=3) break;
			for(it=s.begin();it!=s.end();)
			{
             if(f==3)
			 {
			   f=1;
			   ip=it;
			   it++;
             s.erase(ip);
             flag--;
			 }
			 else
			 {
               f++;
               it++;
			 }
			}

			f=1;if(flag<=3) break;
		}
		int ff=0;
     for(it=s.begin();it!=s.end();++it)
	   {
	         cout<<(*it);
	         ff++;
	         if(ff<=flag-1) cout<<‘ ‘;
	   }
	   cout<<endl;
        }
    }
return 0;
}

 

 

HDU 1276 士兵队列训练问题

标签:

原文地址:http://www.cnblogs.com/zsyacm666666/p/4662461.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!