• HDU 1276 士兵队列训练问题 解题心得


    原题:

    Description

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

    Input

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

    Output

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

    Sample Input

    2 20 40
     

    Sample Output

    1 7 19 1 19 37
     
     
     
    我的代码:
     1 #include<iostream>
     2 #include<list>
     3 #define lit list<int>::iterator
     4 using namespace std;
     5 list<int> soldier;
     6 
     7 
     8 
     9 void delete2(list<int>&a)
    10 {
    11     lit it = a.begin();
    12     for (int i = 1; it != a.end(); it++,i++)
    13     {
    14         if ( i% 2 == 0)
    15         {
    16             *it = 6000;
    17         }
    18     }
    19 }
    20 
    21 
    22 void delete3(list<int>&a)
    23 {
    24     lit it = a.begin();
    25     for (int i = 1; it != a.end(); it++,i++)
    26     {
    27         if (i % 3 == 0)
    28         {
    29             *it = 6000;
    30         }
    31     }
    32 }
    33 
    34 
    35 int main()
    36 {
    37     int t;
    38     cin >> t;
    39     while (t--)
    40     {
    41         soldier.clear();
    42         int n;
    43         cin >> n;
    44         for (int i = 1; i <= n; i++)
    45         {
    46             soldier.insert(soldier.end(),i);
    47         }
    48         for (int i = 0;; i++)
    49         {
    50             if (soldier.size() <= 3)
    51             {
    52                 break;
    53             }
    54             if (i % 2 == 0)
    55             {
    56                 delete2(soldier);
    57                 soldier.remove(6000);
    58             }
    59             else
    60             {
    61                 delete3(soldier);
    62                 soldier.remove(6000);
    63             }
    64         }
    65 
    66         for (lit it = soldier.begin(); it != soldier.end(); it++)
    67         {
    68             if (it==soldier.begin())
    69                 cout << *it;
    70             else
    71             {
    72                 cout << ' ' << *it;
    73             }
    74         }
    75         cout << endl;
    76     }
    77 
    78 
    79     return 0;
    80 }
  • 相关阅读:
    CUDA从入门到精通
    [Network] 计算机网络基础知识总结
    第三章 需求工程概论
    jsp学习
    算法——递推算法
    大话设计模式读书笔记--文章汇总
    轻松学SQL Server数据库
    Oracle数据库建表+添加数据练习
    《C#图解教程》 总览
    php发送get、post请求的6种方法简明总结
  • 原文地址:https://www.cnblogs.com/shawn-ji/p/4678401.html
Copyright © 2020-2023  润新知