1276 병사 대열 훈련 문제 [대열 시 뮬 레이 션]

3064 단어 hduoj대열
병사 대열 훈련 문제
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4565    Accepted Submission(s): 2128
Problem Description
모 부 대 는 신병 대열 훈련 을 실시 하여 신병 을 처음부터 순서대로 번 호 를 매 겨 횡대 로 나란히 세 웠 다. 훈련의 규칙 은 다음 과 같다. 처음부터 1 부터 2 까지 번호, 2 까지 번호, 나머지 는 작은 번호 방향 으로 접근 한 다음 에 처음부터 1 부터 3 까지 번호, 3 까지 번호, 나머지 는 작은 번호 방향 으로 접근 했다.계속 처음부터 1 부터 2 까지 번호...이후 처음부터 1 ∼ 2 번, 1 ∼ 3 번 을 돌아 가면 서 나머지 인원 이 3 명 을 넘 지 않 을 때 까지 진행한다.
 
Input
이 문 제 는 여러 테스트 데이터 팀 이 있 으 며, 첫 번 째 행동 팀 은 N 행 신병 수 이 고, 이 어 N 행 신병 수 이 며, 신병 수 는 5000 을 넘 지 않 는 다.
 
Output
입력 한 신병 수 에 대응 하 는 N 줄 이 있 고, 줄 마다 남 은 신병 의 최초 번 호 를 출력 하 며, 번호 사이 에 빈 칸 이 있 습 니 다.
 
Sample Input
 
   
2 20 40
 

Sample Output
 
   
1 7 19 1 19 37

这个题刚看到的时候没多少思路,如果用数组模拟的话,应该可以实现,因为数组本来就是有顺序的,但是处理的时候就有些复杂了,因为数组删除太麻烦,

想想什么类型的可以便于删除和标记呢,好像没有啊...


再拓展一下思路,发现一个好方法,完全可以用队列模拟,在需要的时候把某个元素舍去,而且不打乱原来的顺序,打乱了?那你把队列循环一圈不就行了吗??

因为有两种不同的处理方法,所以用一个变量标记一下第几次模拟编序号,因为两种编号是交替的.......具体看代码注释............


#include
#include
using namespace std;
int main()
{
	int t,n,i,j;
	scanf("%d",&t);
	while(t--)
	{
		queueq;//    ,             
		scanf("%d",&n);
		for(i=1;i<=n;++i)
		{
			q.push(i);//                
		}
		int p=1,x,k;
		while(q.size()>3)//         ,            
		{
			x=q.size();//        
			if(p&1)//       ,      1   2    
			{
				for(i=0;i      1  
					q.push(k);//     1     ,  
					q.pop();//      1 (      ,       )
					q.pop();//         2 ,  ...
				}
				if(x&1)
				{
					k=q.front();//            ,              ....
					q.push(k);//   
					q.pop();//  .....
				}
			}
			else//    ,     1   3   
			{
				for(i=0;i

이 방법 은 바로 그 과정 을 완전히 모 의 하 는 것 이다. 매번 마지막 에 남 은 몇 사람 을 고려 하면 다른 문 제 는 크 지 않다. 이것 은 스스로 수 동 으로 모 의 하 는 것 이 가장 좋 고 빨리 이해 할 수 있다.
또한 처음으로 stl 안의 대기 열 을 사용 하 는 것 도 좋 은 것 같 습 니 다. 그러나 stl 에서 제공 하 는 데이터 구조 나 함수 의 작업 원 리 를 이해 하지 못 한다 면 되도록 사용 하지 마 세 요. 먼저 이러한 기능 을 모 의 하 는 방법 을 알 아 보 세 요. 그렇지 않 으 면 자신 이 stl 로 간단 한 템 플 릿 문 제 를 풀 수 있 지만 나중에 관련 이 많 을 때...이 함수 들 의 작업 원리 에 대해 잘 모 르 기 때문에 잘 사용 하지 못 할 수도 있 습 니 다.
이렇게 하 는 것 은 치 명 적 인 것 이다. 마치 어떤 사람들 이 순환 을 철저히 이해 하지 못 하면 어떤 데이터 구 조 를 배 워 야 하 는 지, 근본적으로 제대로 배우 지 못 하고 자신의 생각, 자신 이 반드시 어떤 기초 적 인 것 을 튼튼 하 게 해 야 한다 고 느낀다. 그렇지 않 으 면 앞으로 똑 같은 것 이 변형 되면 파악 할 수 없다.
가장 중요 한 건 기초 야..
개인 적 인 관점 은..............................................................

좋은 웹페이지 즐겨찾기