题目:

士兵队列训练问题

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 56 Accepted Submission(s): 37
 
Problem Description
某部队进行新兵队列训练,将新兵从一開始按顺序依次编号,并排成一行横队。训练的规则例如以下:从头開始一至二报数。凡报到二的出列,剩下的向小序号方向靠拢,再从头開始进行一至三报数。凡报到三的出列,剩下的向小序号方向靠拢,继续从头開始进行一至二报数。。。。以后从头開始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

 
Input
本题有多个測试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
 
Output
共同拥有N行,分别相应输入的新兵人数,每行输出剩下的新兵最初的编号。编号之间有一个空格。
 
Sample Input
  1. 2
  2. 20
  3. 40
 
Sample Output
  1. 1 7 19
  2. 1 19 37
 
Author
Cai Minglun
 
Source
杭电ACM集训队训练赛(VI)
 
Recommend
lcy
 

题目分析:

简单模拟。这道题可能对输入例子怎么得到输出例子的有点疑惑。下面是自己的一些理解:

代码例如以下:

  1. /*
  2. * f.cpp
  3. *
  4. * Created on: 2015年3月19日
  5. * Author: Administrator
  6. */
  7.  
  8. #include <iostream>
  9. #include <cstdio>
  10.  
  11. using namespace std;
  12.  
  13. const int maxn = 5001;
  14.  
  15. int soldier[maxn];
  16.  
  17. int main() {
  18. int t;
  19. scanf("%d", &t);
  20. while (t--) {
  21. int n;
  22. scanf("%d", &n);
  23.  
  24. int i;
  25. for (i = 1; i <= n; ++i) {
  26. soldier[i] = i;
  27. }
  28. int cnt = 0;
  29. int sum = n;
  30.  
  31. if (sum <= 3) {
  32. int j;
  33.  
  34. int flag = 1;
  35.  
  36. for (j = 1; j <= n; ++j) {
  37. if (flag == 1) {
  38. flag++;
  39. printf("%d", soldier[j]);
  40. } else {
  41. printf(" %d", soldier[j]);
  42. }
  43. }
  44. printf("\n");
  45.  
  46. continue;
  47. }
  48.  
  49. while (true) {//当队伍中的人数>3的时候不断地循环
  50. int j;
  51. for (j = 1; j <= n; ++j) {//第一次每两个去掉一个
  52. if (soldier[j] != 0) {
  53. cnt++;
  54.  
  55. if (cnt == 2) {
  56. cnt = 0;
  57. soldier[j] = 0;
  58. sum--;
  59. }
  60. }
  61.  
  62. }
  63.  
  64. //假设经历完每两个去掉一个后,队伍中的人数已经<=3
  65. if (sum <= 3) {
  66. break;//则跳出循环
  67. }
  68.  
  69. //能运行下面代码证明队伍中的人数还没有<=3
  70.  
  71. cnt = 0;//将计数器中的清0
  72.  
  73. for (j = 1; j <= n; ++j) {//第二次每3个去掉一个
  74. if (soldier[j] != 0) {
  75. cnt++;
  76.  
  77. if (cnt == 3) {
  78. cnt = 0;
  79. soldier[j] = 0;
  80. sum--;
  81. }
  82. }
  83. }
  84.  
  85. if (sum <= 3) {//假设经历每3个去掉一个后,队伍中的人数已经<=3
  86. break;//则跳出循环
  87. }
  88.  
  89. //假设还能运行下面代码,那么证明队伍中的忍术还没有<=3
  90.  
  91. cnt = 0;//将计数器清0
  92. }
  93.  
  94. //把最后剩下的人输出来
  95. int flag = 1;
  96. for (i = 1; i <= n; ++i) {
  97. /**
  98. * 要注意对数据输出格式的处理.
  99. * 输出格式要严格遵循x_x_x_x的形式( _表示一个空格 )
  100. * 不要输出成x_x_x_x_ ,这样会PE
  101. */
  102. if (soldier[i] != 0) {
  103. if (flag == 1) {//第一个数据不须要输出空格,即输出"x"形式的数据就可以
  104. flag++;
  105. printf("%d", soldier[i]);
  106. } else {//假设不是第一项数据
  107. printf(" %d", soldier[i]);//输出"_x"形式的数据
  108. }
  109. }
  110. }
  111. printf("\n");
  112. }
  113.  
  114. return 0;
  115. }

(hdu step 8.1.6)士兵队列训练问题(数据结构,简单模拟——第一次每2个去掉1个,第二次每3个去掉1个.知道队伍中的人数&lt;=3,输出剩下的人 )的更多相关文章

  1. HDU 4509 湫湫系列故事——减肥记II (简单模拟)

    题意:一天一共有1440分钟,主人公每天有n件事要做,给出这n件事开始跟结束的时间,然后让你求出,空闲的时间的总分钟数是多少. 解题报告:简单模拟,只要开个一维数组标记那个每个分钟是否是有事的就可以了 ...

  2. HDU 1276 士兵队列训练问题(队列)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1276 题目: 士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Othe ...

  3. HDU 1276 士兵队列训练问题(模拟)

    原题代号:HDU 1276 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1276 题目原题: 士兵队列训练问题 Time Limit: 2000/10 ...

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

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

  5. ACM学习历程—HDU 1276 士兵队列训练问题(队列)

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

  6. 暑假集训(1)第一弹 -----士兵队列训练问题(Hdu1276)

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

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

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

  8. HDU1276(士兵队列训练模拟与链表)

    HDU1276 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Descripti ...

  9. A - 士兵队列训练问题

    A - 士兵队列训练问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

随机推荐

  1. ⑾bootstrap组件 徽章 大屏 页头 基础案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Problem E: 分数类的输出

    Problem E: 分数类的输出 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2699  Solved: 1227[Submit][Status][ ...

  3. python jason,pickle

    参考官网 https://docs.python.org/3/library/json.html https://docs.python.org/3/library/pickle.html 了解这两个 ...

  4. Mybatis框架的搭建和基本使用方法

    1.1MyBatis的下载 最新yBatis可以在github官网上下载: https://github.com/mybatis/mybatis-3 1.2 Mybatis Jar包 1.3MyBat ...

  5. linux C/C++开发环境搭建指南

    一.安装基本开发环境 1.配置GCC 刚装好的系统中已经有GCC了,但是这个GCC什么文件都不能编译,因为没有一些必须的头文件,所以要安装build-essential这个软件包,安装了这个包会自动安 ...

  6. asp.net web api 文件上传

    1正确的做法 public class AvaterController : BaseApiController { [HttpPost] public async Task<IHttpActi ...

  7. java之JVM学习--基本机构

    JDK,JRE,JVM关系图 JVM物理结构: jvm内存区详解: 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字 ...

  8. 打印中文dict list的各种姿势

    在开发过程中,我们经常需要打印一些变量的值,便于调试.这个时候就会发现如果在dict list这些容器中,如果包含中文字符,不管是str类型,还是unicode类型,都打印不出来.如下: >&g ...

  9. PHP截取带有汉字的字符串,将汉字按两个字节计算

    <?php header("Content-type:text/html;charset=utf-8"); /** *截取字符串,汉字占两个字节,字母占一个字节 *页面编码必 ...

  10. configpraser模块

    configpraser配置文件,example.conf [data] #节点 username = Jason password = 123 [public] comment = stuff pu ...