• 新兵训练(=@__@=)


    题意:

    Description

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

    Input

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

    Output

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

    Sample Input

    2
    20
    40
     

    Sample Output

    1 7 19
    1 19 37
     
     
    思路:
             士兵1-2报数时,用循环加公式i % 2 + 1 == 2把报到2的士兵找出来,将他们的编号变大,计算剩下的人,重新从大到小排列,士兵1-3报数也是如此。最后剩下三人就只要输出数组的前三个数就好了。
     
     
    源代码:
     1 #include<iostream>
     2 #include<algorithm>
     3 using namespace std;
     4 #define maxn 5000
     5 int main()
     6 {
     7     int t;
     8     cin >> t;
     9     while (t--)
    10     {
    11         int count=0;
    12         int a[maxn],num;
    13         cin >> num;
    14         int num1 = num;
    15         for (int i = 0; i < num; i++)
    16         {
    17             a[i]=i+1;
    18         }
    19         while (num> 3)
    20         {
    21             for (int i = 0; i < num; i++)
    22             {
    23                 if (i % 2 + 1 == 2)
    24                 {
    25                     a[i] =num1+1;      //报数为2的士兵,编号变大。
    26                     count++;
    27                 }
    28 
    29             }
    30             sort(a, a + num);         //重新排序,让剩下的士兵排到前面。
    31             num= num - num/2;        //计算剩下的人
    32 
    33             if (num<= 3)
    34             {
    35                 break;
    36             }
    37             else
    38             {
    39                 for (int i = 0; i < num; i++)
    40                 {
    41                     if (i%3+1== 3)
    42                     {
    43                         a[i] = num1+1;//   把不要的数变大,以便后面排序时在后面。
    44                     }
    45 
    46                 }
    47                 sort(a, a + num);
    48                 num = num -num/3;
    49 
    50             }
    51         }
    52         for (int i = 0; i < num-1; i++)
    53         {
    54             cout << a[i] << " ";          //输出最后的三人
    55         }
    56         cout << a[num - 1] << endl;      
    57     }
    58     
    59     return 0;
    60 }

    心得:

           感觉良好。。。加油!

    ------------------------ 没有谁的人生不是斩棘前行 ---------------------------------------- JM
  • 相关阅读:
    分类管理模块
    Java8新特性 集合的stream的map
    条件和分页查询
    工作常用系统汇总
    Dubbo简单环境搭建
    深入浅出 TCP/IP 协议栈
    非对称加密
    理解Cookie和Session机制
    jQuery学习
    数据库系列学习(六)-函数之数学函数
  • 原文地址:https://www.cnblogs.com/Lynn0814/p/4675030.html
Copyright © 2020-2023  润新知