您的位置:首页 > 理论基础 > 计算机网络

士兵队列训练问题http://acm.hdu.edu.cn/showproblem.php?pid=1276

2013-08-13 13:54 573 查看

士兵队列训练问题

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2663 Accepted Submission(s): 1211


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

[align=left]Input[/align]
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。

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

[align=left]Sample Input[/align]

2 20 40

[align=left]Sample Output[/align]

1 7 19 1 19 37

[align=left]Author[/align]
Cai Minglun

[align=left]Source[/align]
杭电ACM集训队训练赛(VI)

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
struct queue
{
int capacity;
int size;
int *array;
int tail;
int end;
};
int add(queue *q,int value)
{
q->array[q->end] = value;
q->end++;
q->size++;
return value;
}
int peek(queue *q)
{
return q->array[q->tail];
}
int pull(queue *q)
{
int value = q->array[q->tail];
q->array[q->tail] = 0;
q->tail++;
q->size--;
return value;
}

int get_size(queue *q)
{
return q->size;
}

int get_capacity(queue *q)
{
return q->capacity;
}

int init_queue(queue *q, int capacity)
{
q->capacity = capacity;
q->size = 0;
q->tail = 0;
q->end = 0;
q->array = (int*)malloc(capacity*sizeof(int));
memset(q->array,0,sizeof(q->array));
return 1;
}
int init_queue(queue *q)
{
q->size = 0;
q->tail = 0;
q->end = 0;
return 1;
}
int free_queue(queue *q)
{
free(q);
return 1;
}

int main()
{
queue* sq = NULL;
queue* eq = NULL;
int cases,i,n,j,num=2;
scanf("%d",&cases);
while(cases-->0)
{
sq = (queue*)malloc(sizeof(queue));
eq = (queue*)malloc(sizeof(queue));
scanf("%d",&n);
init_queue(sq,n);
init_queue(eq,n);
for(i=1; i<=n; ++i)
{
add(sq,i);
}
num = 2;
while(1 && n>3)
{
i=1;
if(num==2)
{
while(sq->size > 0)
{
if(i!=num)
{
add(eq,pull(sq));
++i;
}
else
{
pull(sq);
i = 1;
}
}

if(eq->size <= 3)
{
break;
}
num = 3;
init_queue(sq);
}
else if(num == 3)
{
while(eq->size > 0)
{
if(i!=num)
{
add(sq,pull(eq));
++i;
}
else
{
pull(eq);
i = 1;
}
}

if(sq->size <= 3)
{
break;
}
num = 2;
init_queue(eq);
}
}
if(eq->size == 0)
{
while(sq->size>1)
{
printf("%d ",pull(sq));
}
printf("%d\n",pull(sq));
}
else
{
while(eq->size>1)
{
printf("%d ",pull(eq));
}
printf("%d\n",pull(eq));
}
free(sq);
free(eq);
}
system("PAUSE");
return 0;
}


这是用队列写的程序,我还不太会队列,所以这也不是我写的,这是学长帮我们写的,虽说听他讲了一遍,但一顿饭之后我忘得一干二净。所以懂得行家可以看一下。下面是我自己写的,不会队列的朋友们,可以看一下下面的代码:

#include<stdio.h>
#include<string.h>
#define M 5000
int main()
{
int a[M+10],b[M+10],c[M+10];
int n;
while(scanf("%d",&n)!=EOF)
{
while(n--)
{
int i,j,num,count=2;
scanf("%d",&num);
for(i=1;i<=num;i++)
a[i]=i;
if(num==0)
printf("%d\n",0);
else if(num==1)
printf("%d\n",1);
else if(num==2)
printf("%d %d\n",1,2);
else if(num==3)
printf("%d %d %d\n",1,2,3);
else
{
while(1)
{
if(count==2)
{
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(j=1,i=1;i<=num;i++)
{
if((i%2)!=0)
{
c[j]=b[j]=a[i];
j++;
}
}
num=j-1;
count=3;
if(j<=4)
break;
}
else if(count==3)
{
memset(a,0,sizeof(a));
for(j=1,i=1;i<=num;i++)
{
if((i%3)!=0)
{
c[j]=a[j]=b[i];
j++;
}
}
num=j-1;
count=2;
if(j<=4)
break;
}
}
for(i=1;i<=num;i++)
{
if(i!=num)
printf("%d ",c[i]);
else
printf("%d\n",c[i]);
}
}
}
}
return 0;
}


其实和队列的思想一样,先进先出,我只不过是用了两个数组实现了这个操作,大家可以看一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: