16级第三周寒假作业E题

兵队列训练问题

TimeLimit:1000MS  MemoryLimit:32768KB

64-bit integer IO format:%I64d

Problem Description

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

Input

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

Output

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

SampleInput

2
20
40SampleOutput
1 7 19
1 19 37

思路:这个题第一次看起来我是 没什么思路的(抛弃旺神提示的队列),然后就开始想说用数组模拟,因为我们放进数组的时候本身就是有顺序的,但是处理的时候就有些复杂了,因为数组删除太麻烦;所以就用队列模拟,在需要的时候把某个元素舍去,而且不打乱原来的顺序,打乱了?那你把队列循环一圈不就行了吗??因为有两种不同的处理方法,所以用一个变量标记一下第几次模拟编序号放上我的代码,如果有什么不懂就看我的代码上面有注释

 1 #include<stdio.h>
 2 #include<queue>
 3 using namespace std;
 4 int main()
 5 {
 6     int N,n;
 7     scanf("%d",&N);
 8     while(N--)
 9     {
10         queue<int>q;//这个应该都懂的,队列定义;
11         scanf("%d",&n);
12         for(int i=1;i<=n;i++)
13             q.push(i);//把每个人的编号按顺序压入队列
14         int p=1,x,k;
15         while(q.size()>3)////如果还有超过三个人,继续进行编号和排除等操作
16         {
17             x=q.size();////目前一共有多少人
18             if(p&1)//如果是第奇数次,那么就是从 1 到 2 编号
19             {
20                 for(int i=0;i<x/2;i++)//循环操作
21                 {
22                     k=q.front();//取出编号为1的
23                     q.push(k);//把编号为 1 的放后边,入队
24                     q.pop();////抛弃编号为 1 (已经放后面了,这个就不需要了)
25                     q.pop();//现在弹出的编号为 2 ,抛弃...
26                 }
27                 if(x&1)
28                 {
29                     k=q.front();//如果刚开始的时候为奇数个,那么最后还有一个人没被循环过....
30                     q.push(k);//放队尾
31                     q.pop();//抛弃.
32                 }
33             }
34             else//第偶数次,那就是从 1 到 3 编号
35             {
36                 for(int i=0;i<x/3;i++)
37                 {
38                     k=q.front();//处理编号为 1 ,处理方式和前面一样
39                     q.push(k);
40                     q.pop();
41                     k=q.front();q.push(k);//处理编号为 2
42                     q.pop();
43                     q.pop();//抛弃编号为 3 的
44                 }
45                 while(x%3!=0)//这里和前面的道理一样,防止有人未处理完
46                 {
47                     --x;
48                     k=q.front();//处理剩余的那几个
49                     q.push(k);
50                     q.pop();
51                 }
52             }
53             p++;
54         }
55         while(q.size()!=1)//输出
56         {
57             printf("%d ",q.front());
58             q.pop();
59         }
60         printf("%d\n",q.front());
61     }
62     return 0;
63 }

AC代码

时间: 2024-12-20 20:58:44

16级第三周寒假作业E题的相关文章

16级第三周寒假作业F题

Sliding Window TimeLimit:12000MS  MemoryLimit:65536K 64-bit integer IO format:%lld Problem Description Case Time Limit: 5000MS An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving from the very left of the arr

16级第二周寒假作业J题

Favorite Donut TimeLimit: 1500/1000 MS (Java/Others)  MemoryLimit: 131072/131072 K (Java/Others) 64-bit integer IO format:%I64d Problem Description 露露爱吃甜食.她最喜欢的食物是环形甜甜圈.每天她从同一个面包店买一个环形甜甜圈.环形甜甜圈由n个部分组成.每个部分具有其自身的糖度,甜度可以由从a到z(从低到高)的字母表示,并且环形甜甜圈可以以一个第i个

16级第一周寒假作业H题

涨姿势题2 TimeLimit:1000ms  MemoryLimit:128000KB 64-bit integer IO format:%lld Problem Description 涨姿势题就是所谓的优化题,在组队赛中,队伍发现了一题水题,那么应该交给谁去处理?作为处理水题的代码手,应该具备什么样的素养?1,要快,水题拼的就是速度!2,不能卡水题!水题都卡,绝对不是一个代码手的风范!3,不能出错,错一次即罚时20分钟,对于水题来讲是致命的!4,要能看出来一题是水题!没有这条,上面三条都是

16级第一周寒假作业D题

第八集,体能训练 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description 小A和小C跋山涉水,终于来到了特工们要聚集的城市,他们俩在附近找了家宾馆住下.这时,距离特工们聚会的时间越来越近了,是时候来一波体能训练,以防遇到危险,跑得太慢了,被抓住了,就GG了- 于是,小A和小C一起来到了宾馆附近的体育馆的环形操场上跑步,起先,他们两个人约定,一开始他们两个人从同一点,反方向跑步,每

16级第二周寒假作业B题

Line belt TimeLimit:1000MS  MemoryLimit:32768KB 64-bit integer IO format:%I64d Problem Description In a two-dimensional plane there are two line belts, there are two segments AB and CD, lxhgww's speed on AB is P and on CD is Q, he can move with the s

16级第一周寒假作业

涨姿势题2 TimeLimit:1000ms  MemoryLimit:128000KB 64-bit integer IO format:%lld Problem Description 涨姿势题就是所谓的优化题,在组队赛中,队伍发现了一题水题,那么应该交给谁去处理?作为处理水题的代码手,应该具备什么样的素养?1,要快,水题拼的就是速度!2,不能卡水题!水题都卡,绝对不是一个代码手的风范!3,不能出错,错一次即罚时20分钟,对于水题来讲是致命的!4,要能看出来一题是水题!没有这条,上面三条都是

FJUT16级第一周寒假作业题解I题

涨姿势题3 TimeLimit:1000ms  MemoryLimit:128000KB 64-bit integer IO format:%lld Problem Description 涨姿势题就是所谓的优化题,在组队赛中,队伍发现了一题水题,那么应该交给谁去处理?作为处理水题的代码手,应该具备什么样的素养?1,要快,水题拼的就是速度!2,不能卡水题!水题都卡,绝对不是一个代码手的风范!3,不能出错,错一次即罚时20分钟,对于水题来讲是致命的!4,要能看出来一题是水题!没有这条,上面三条都是

16级第四周寒假作业A题

T^T找数字 TimeLimit:1000MS  MemoryLimit:256MB 64-bit integer IO format:%I64d Problem Description 有一天,T^T来到了师大比赛,看上了师大的ACMer小彩,于是他就跑上去想跟人家搭讪,可是呢,这时候,小彩遇到了一个问题,小彩说,你要是帮我解决了这个 问题,我就把我的手机号给你,T^T一听,顿时乐了起来,这不是我的强项嘛,于是就让小彩说了: 给定整数a1,a2,....,an,判断是否可以从中选出若干数(取数

第三周机电作业

一.题目要求 结合本周学习的直流电机机械特性,用Modelica设计和仿真一个直流电机串电阻启动过程,具体要求如下: 1)电机工作在额定电压和额定磁通下,采用串三段或四段电阻启动,整个启动过程电枢电流中不能超过额定电流的3倍. 2)选择合适的电阻阻值,选择优化的电阻切除策略,使得在满足条件1的前提下,电机尽可能快速平滑得达到额定点.仿真效果最佳的同学获得本周"控制之星"称号. 3)所有同学均使用如下统一的直流电机模型,电机的参数为: 额定电压:240V 额定电流:16.2A 额定转矩: