您的位置:首页 > 其它

HDU 1276 士兵队列训练问题

2014-08-17 21:53 176 查看
/*

题目大意:先报到二的出列,剩下的人报到三的人出列,重复上述规律,直到剩下的人不超过三人

解题思路:用数组下标处理一下就可以了

难点详解:先设一个变量 x 用于控制剔除数标准,再将下标不能被x整除的数覆盖在原来的数上,之后就是将 x 变成下一个剔除数的标准

关键点:想起用数组的下标处理问题,考虑到特殊的情况

解题人:lingnichong

解题时间:2014-06-01 11:59:14 写 2014-08-16 09:35:36 重写

解题体会:一开始没想起用数组下标处理数,是个好题

*/


士兵队列训练问题

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 3534 Accepted Submission(s): 1647

Problem Description

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

Input

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

Output

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

Sample Input

2
20
40


Sample Output

1 7 19
1 19 37


Author

Cai Minglun

Source

杭电ACM集训队训练赛(VI)

#include<stdio.h>
#define MAXN 5000+10
int a[MAXN]={0};
int main()
{
    int n,m;
    int i,j;
    int x,k;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        if(m==1)    printf("1\n");
        else if(m==2)    printf("1 2\n");
        else if(m==3)    printf("1 2 3\n");
        else
        {
            for(i=1;i<=m;i++)//将每个数组的每个元素都赋值相应的数字
                a[i]=i;
            x=2;//方便后面的将报到二和三的剔除
            while(m>3)//直到剩下的人数小于三人为止
            {
                k=1;
                j=m;
                for(i=1;i<=j;i++)//将不能被x整除的下标记录下来 ,并把里面的数记录下来
                {
                    if(i%x!=0)  a[k++]=a[i];//留下下标不会被x整除的的下标
                    else    m--;//如果下标可以被x整除,总数就减去一
                }
                if(x==2)//变换x的值,用于下次的剔除下标所用
                    x=3;
                else
                    x=2;
            }
            printf("1");
for(i=2;i<k;i++)
{
printf(" %d",a[i]);
}
printf("\n");
            
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: