新兵队列训练C++(简单实现)
题目:某部队进行新兵队列训练,将新兵从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++(简单实现)相关推荐
- 解题报告:hdu 1276 士兵队列训练问题 - 简单题
Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行 ...
- 第 13 周 / 编程题 - 新兵队列训练(选做)
某部队进行新兵队列训练,将新兵从1开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始1至2报数,凡报到2的出列,剩下的向小序号方向靠拢,再从头开始进行1至3报数,凡报到3的出列,剩下的向小序 ...
- 士兵队列训练问题:某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的
题目描述: 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列, ...
- dhu 4.1 队列模板简单应用算法设计:士兵队列训练
队列模板简单应用算法设计:士兵队列训练 时间限制: 1S类别: DS:队列->队列定义及应用 晚于: 2022-05-04 23:55:00后提交分数乘系数50% 截止日期: 2022-05-0 ...
- 队列模板简单应用算法设计:士兵队列训练
问题描述 : 目的:使用C++模板设计队列(链队列和顺序队列)的抽象数据类型(ADT).并在此基础上,使用队列ADT的基本操作,设计并实现简单应用的算法设计. 内容:(1)请参照栈的ADT模板,设计队 ...
- c++实现简单的数据结构(1.链表合并 2.士兵队列训练问题 3.Rails 4.Josephus Problem 5.Tree Recovery 6.四则运算 7.愚人节的礼物 8.Web)
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮 ...
- 杭电1276--士兵队列训练问题
士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 1276 士兵队列训练问题【队列模拟】
士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu1276 士兵队列训练问题-list容器
Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行 ...
最新文章
- 设置session失效的几种方法
- c语言r5够用吗,泡菜说丨普通人有必要买R5吗?
- centos7 安装git_如何在 CentOS 7 上挂载 Amazon EFS 文件系统?
- 【转】tf中的padding方式SAME和VALID有什么区别?
- RxJava实现事件总线——RxBus
- 模糊c均值聚类_六种常用的文本聚类方法介绍
- 水晶报表10高级开发版下载及序列号
- android studio 使用开源库
- 跟着开源项目学因果推断——whynot(十四)
- Ubuntu 在线升级linux 内核的方法
- Atititi 版本管理 rc final rtm ga release 软件的生命周期中一般分4个版本
- python md5解密_Python md5解密
- DBImport v3.0 中文版发布:支持各大数据库数据互导(IT人员必备工具)
- csdn下载分获取方法
- UE4 单面模型法线翻转及碰撞问题
- jQuery的绑定与解绑方法
- 内网穿透基础概念---内网外网
- matlab扩充内存,matlab中内存不够用的解决方案
- 计算机无法搜索到计算器,我的电脑中的计算器没有了,怎么办?
- Android 与其他基于 Linux 的系统有何不同?