HDU1276 士兵队列训练问题

本文详细解析了一个关于新兵队列训练的算法问题,通过一轮轮的报数筛选,最终确定剩余士兵的原始编号。该算法挑战在于正确理解和实施报数规则,确保每轮完整执行直至剩下不超过三人。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

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

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

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

Sample Input

  
22040
 

Sample Output

  
1 7 191 19 37
 


 

//这题蛋疼,要注意题意

意识必须每一轮都点完,而不是一数到只剩三人了就停止

二是要注意不要超时

#include <iostream>using namespace std;int main(){    int n;    while(cin >> n)    {        while(n--)        {            int m,a[5005] = {0},i;            cin >> m;            int sum;            sum = m;            for(i = 1; i<=m; i++)            {                a[i] = i;            }            if(m<=3)            {                cout << "1";                for(i = 2; i<=m; i++)                {                    if(a[i])                    {                        cout << " " << a[i];                    }                }                cout << endl;                continue;            }            while(1)            {                int flag = 0;                for(i = 1; i<=m; i++)                {                    if(a[i])                        flag++;                    if(flag==2)                    {                        a[i] = 0;                        flag = 0;                        sum--;                    }                }                if(sum<=3)                break;                flag = 0;                for(i = 1; i<=m; i++)                {                    if(a[i])                        flag++;                    if(flag==3)                    {                        a[i] = 0;                        flag = 0;                        sum--;                    }                }                if(sum<=3)                    break;            }            cout << "1";            sum--;            for(i = 2; sum; i++)            {                if(a[i])                {                    cout << " " << a[i];                    sum--;                }            }            cout << endl;        }    }    return 0;}


 

 

           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值