士兵队列训练问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11849    Accepted Submission(s): 5194

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)

问题链接:HDU1276 士兵队列训练问题

问题描述:(略)

问题分析

这个问题用模拟法来解决。

数据结构可以采用3种,分别是数组、STL的vector和list。

程序说明:(略)

参考链接:(略)

题记:想不到好办法,要么枚举,要么模拟。

AC的C++语言程序(array)如下:

/* HDU1276 士兵队列训练问题 */#include <iostream>
#include <stdio.h>using namespace std;const int N = 5000;
int a[N + 1];int main()
{int n, k, cnt;scanf("%d", &n);while(n--) {scanf("%d", &k);for(int i = 1; i <= k; i++)a[i] = i;cnt = k;while(cnt > 3) {int cnt2 = 0;for(int i = 1; i <= k; i++)if(a[i]) {if(++cnt2 == 2) {a[i] = 0;cnt2 = 0;cnt--;}}if(cnt <= 3)break;cnt2 = 0;for(int i = 1; i <= k; i++)if(a[i])if(++cnt2 == 3) {a[i] = 0;cnt2 = 0;cnt--;}}int cnt2 = 0;for(int i = 1; i <= k; i++) {if(a[i] > 0) {if(i != 1)printf(" ");printf("%d", a[i]);if(++cnt2 == cnt) {printf("\n");break;}}}}return 0;
}

AC的C++语言程序(vector)如下:

/* HDU1276 士兵队列训练问题 */#include <iostream>
#include <vector>
#include <stdio.h>using namespace std;int main()
{int n, k;scanf("%d", &n);while(n--) {scanf("%d", &k);vector<int> v;for(int i = 1; i <= k; i++)v.push_back(i);while(v.size() > 3) {for(int i = (v.size() / 2) * 2 - 1; i >= 1; i -= 2)v.erase(v.begin() + i);if(v.size() <= 3)break;for(int i = (v.size() / 3) * 3 - 1; i >= 2; i -= 3)v.erase(v.begin() + i);}for(int i = 0; i < (int)v.size(); i++) {if(i != 0)printf(" ");printf("%d", v[i]);}printf("\n");}return 0;
}

AC的C++语言程序(list)如下:

/* HDU1276 士兵队列训练问题 */#include <iostream>
#include <list>
#include <stdio.h>using namespace std;int main()
{int n, k;scanf("%d", &n);while(n--) {scanf("%d", &k);list<int> l;list<int>::iterator it;int i;for(i = 1; i <= k; i++)l.push_back(i);while(l.size() > 3) {for(i =1, it = l.begin(); it != l.end();) {if(i % 2 == 0) {it = l.erase(it);i = 1;} elseit++, i++;}if(l.size() <= 3)break;for(i =1, it = l.begin(); it != l.end();) {if(i % 3 == 0) {it = l.erase(it);i = 1;} elseit++, i++;}}for(list<int>::iterator it = l.begin(); it != l.end(); it++) {if(it != l.begin())printf(" ");printf("%d", *it);}printf("\n");}return 0;
}

HDU1276 士兵队列训练问题【模拟+array+vector+list】相关推荐

  1. hdoj 1276 士兵队列训练问题 模拟队列

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

  2. HDU1276士兵队列训练问题 循环队列

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

  3. HDU-1276 士兵队列训练问题

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

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

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

  5. HDU1276:士兵队列训练问题

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

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

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

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

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

  8. 士兵队列训练问题 HDU - 1276

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

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

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

最新文章

  1. LSM Tree 学习笔记——MemTable通常用 SkipList 来实现
  2. SQL语句对于NUll的筛选
  3. ResizeObserver - 元素resize监听API
  4. 优化器,SGD+Momentum;Adagrad;RMSProp;Adam
  5. 上海交通大学出版社python教材答案学生信息管理系统_学生信息管理系统任务书...
  6. pdf转换成word转换器免费下载
  7. sit是什么环境_DEV SIT UAT PET SIM PRD PROD常见环境英文缩写含义
  8. 网络爬虫技术是什么,网络爬虫的基本工作流程是什么?
  9. CentOS7里ping命令详解
  10. linux磁盘空间df-h出不出来,linux 故障:df -h统计磁盘空间占用太多,但又du -h找不到大的文件...
  11. 3626 三元一次方程(枚举)
  12. 青龙面板运行·小米改步
  13. NEXTCHIP概述-2
  14. phantompdf 下载_英雄联盟手游详细下载方法,附中文翻译!
  15. 第979期机器学习日报(2017-05-24)
  16. 微软认证70-541,70-542等考试试题(80%以上的题目是一样的)
  17. linux升级补丁包,linux 升级补丁
  18. 瞬变电磁数据读取显示,正演计算,及基础处理DLL文件调用
  19. 这200道java大厂面试题全部掌握,“面试”想去哪就去哪
  20. 在将公司“一拆六”后,阿里巴巴未来将释放出哪些投资价值?

热门文章

  1. mysql 逗号 join_mysql – sql join表,其中1列有逗号
  2. 《深入理解TypeScript》读后感一篇【基础篇】
  3. Kubernetes中的nodePort,targetPort,port的区别和意义(转)
  4. C#反射取得方法、属性、变量
  5. Starling实现的硬皮翻书效果
  6. C# 多个图片叠加,图片透明.
  7. mach内核和linux对比,海思Hi3511/Hi3512 Linux内核与标准内核差异说明
  8. git 分支merge主分支 解决冲突
  9. python classmethod 与 staticmethod
  10. mysql navicat授权_Mysql授权允许远程访问解决Navicat for MySQL连接mysql提示客户端不支持服务器请求的身份验证协议;考虑升级MySQL客户端...