题目:某部队进行新兵队列训练,将新兵从1开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始1至2报数,凡报到2的出列,剩下的向小序号方向靠拢,再从头开始进行1至3报数,凡报到3的出列,剩下的向小序号方向靠拢,继续从头开始进行1至2报数,以后从头开始轮流进行1至2报数、1至3报数直到剩下的人数不超过三人为止。编写程序,输入数N为最开始的新兵人数(20 < N < 6000),输出剩下的新兵最初的编号。

输入样例:

21

输出样例:

1 7 19

来自编程小白(没错就是我)的想法:

  • 因为N是变量,所以用new实现内存分配(讲真,学校网站用的在线编译器太老了,不过问题不大),支持新标准C++的可以直接int list[N]
  • 根据题目中“像小序号靠拢”,说明每次有人出队列,第二次报数的时候,人们在队列中的位置会发生变化,但是最后还要输出人们的起始位置,所以我就想用一个结构体,存储起始位置和新位置。
  • 如果用数组的话,可以让他们的位置编号和数组的索引相对应。
  • 由2 可知需要一个函数来赋予他们新的位置,然后出队列的时候把新位置的值变成0,表示他出去了。
  • 使用一个变量count来区分是1-3还是1-2
  • 由于题目要求剩余人数不大于3个的时候停止,所以需要一个记录队列中有效人数的数字num
  • 输出的时候注意最后一位没有空格

贴代码:

#include<iostream>struct element {int festnum;int Newnum;
};void renum(element* list, int N ) {      //给他新的编号int n = 1;for (int i = 0; i < N; i++) {if (list[i].Newnum != 0) {list[i].Newnum = n;n++;}}
}                                                 void gout(element* list,int N,int count,int& num) {for (int i = 0; i < N; i++) {if (list[i].Newnum % count == 0 && list[i].Newnum != 0) {list[i].Newnum = 0;num--;}}
}int main() {int N;element* list;int count = 2;std::cin >> N;list = new element[N];int num = N;for (int i = 0; i < N; i++) {list[i].festnum = i+1;  //记录编号list[i].Newnum = list[i].festnum;}                          //删除完一次就重新给一个编号while (num > 3) {gout(list, N, count, num);renum(list, N);if (count == 2) count = 3;else count = 2;}int x = 1;for (int i = 0; i < N; i++) {if (list[i].Newnum != 0&&x!=num) {std::cout << list[i].festnum<<" ";x++;continue;}if (list[i].Newnum != 0 && x == num) {std::cout << list[i].festnum;break;}}delete[] list;
}

新兵队列训练C++(简单实现)相关推荐

  1. 解题报告:hdu 1276 士兵队列训练问题 - 简单题

    Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行 ...

  2. 第 13 周 / 编程题 - 新兵队列训练(选做)

    某部队进行新兵队列训练,将新兵从1开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始1至2报数,凡报到2的出列,剩下的向小序号方向靠拢,再从头开始进行1至3报数,凡报到3的出列,剩下的向小序 ...

  3. 士兵队列训练问题:某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的

    题目描述: 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列, ...

  4. dhu 4.1 队列模板简单应用算法设计:士兵队列训练

    队列模板简单应用算法设计:士兵队列训练 时间限制: 1S类别: DS:队列->队列定义及应用 晚于: 2022-05-04 23:55:00后提交分数乘系数50% 截止日期: 2022-05-0 ...

  5. 队列模板简单应用算法设计:士兵队列训练

    问题描述 : 目的:使用C++模板设计队列(链队列和顺序队列)的抽象数据类型(ADT).并在此基础上,使用队列ADT的基本操作,设计并实现简单应用的算法设计. 内容:(1)请参照栈的ADT模板,设计队 ...

  6. c++实现简单的数据结构(1.链表合并 2.士兵队列训练问题 3.Rails 4.Josephus Problem 5.Tree Recovery 6.四则运算 7.愚人节的礼物 8.Web)

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮 ...

  7. 杭电1276--士兵队列训练问题

    士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. 1276 士兵队列训练问题【队列模拟】

    士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. hdu1276 士兵队列训练问题-list容器

    Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行 ...

最新文章

  1. 设置session失效的几种方法
  2. c语言r5够用吗,泡菜说丨普通人有必要买R5吗?
  3. centos7 安装git_如何在 CentOS 7 上挂载 Amazon EFS 文件系统?
  4. 【转】tf中的padding方式SAME和VALID有什么区别?
  5. RxJava实现事件总线——RxBus
  6. 模糊c均值聚类_六种常用的文本聚类方法介绍
  7. 水晶报表10高级开发版下载及序列号
  8. android studio 使用开源库
  9. 跟着开源项目学因果推断——whynot(十四)
  10. Ubuntu 在线升级linux 内核的方法
  11. Atititi 版本管理 rc final rtm ga release 软件的生命周期中一般分4个版本
  12. python md5解密_Python md5解密
  13. DBImport v3.0 中文版发布:支持各大数据库数据互导(IT人员必备工具)
  14. csdn下载分获取方法
  15. UE4 单面模型法线翻转及碰撞问题
  16. jQuery的绑定与解绑方法
  17. 内网穿透基础概念---内网外网
  18. matlab扩充内存,matlab中内存不够用的解决方案
  19. 计算机无法搜索到计算器,我的电脑中的计算器没有了,怎么办?
  20. Android 与其他基于 Linux 的系统有何不同?

热门文章

  1. 超级计算机方程式,超级计算机重建宇宙从大爆炸到今天
  2. Visifire图表
  3. OpenGL ES EGL eglSwapBuffer
  4. 八大防火墙评测 谁才是真“金钟罩”
  5. opencv3.4.0安装contrib3.0.0模块
  6. Kafka实践指南:快速掌握部署使用与常用命令
  7. 照片如何转换成pdf
  8. Docer镜像的导入导出
  9. IT治理框架COBIT流程
  10. 模型评估:K-S值和AUC的区别