• Problem C 链表


    Description

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

    Input

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

    Output

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

    Sample Input

    2 20 40
     

    Sample Output

    1 7 19 1 19 37
     
    分析:
      用一个数组将其存下,第一次将下标为偶数的保存,下标为奇数的出列,第二次将i%3==2的数消掉,
    然后又按着第一,二次这样循环往复,当数的个数小于,等于3时,输出为被消掉的数的编号。
     
     

    #include <iostream>
    #include <cstring>
    #include <list>
    const int maxn=5000+5;
    using namespace std;
    int main()
    {
      int t;
      scanf("%d",&t);
      while (t--)
      {
        int n, a[maxn];
        memset(a, 1, sizeof(a));
        scanf("%d",&n);
        for (int i = 1; i <= n; i++)
        a[i] = i;
        int k = n;
        int loge = 2;
        while (k > 3)
        {
          int q = 0;
          if (loge == 2)
          {
            for (int i = 1; i <= n; i++)
            if (a[i] != 0 && ++q == 2)
            {
              q = 0;
              a[i] = 0;
              k--;
            }
              loge = 3;
          }
          else
          {
            for (int i = 1; i <= n; i++)
            if (a[i] != 0)
            {
              if (a[i] != 0 && ++q == 3)
              {
                q = 0;
                a[i] = 0;
                k--;
              }
            }
            loge = 2;
          }

        }
        loge = 1;
        for (int i = 1; i <= n; i++)
        if (a[i] != 0)
        if (loge)
        {
          cout << i;
          loge = 0;
        }
        else
          cout << ' ' << i;

         cout << endl;
      }

    return 0;

    }

  • 相关阅读:
    CCCC练习即感
    1003 我能通过
    录制开讲啦杂感
    OOP第三次上机
    关于C++随机函数
    蓝桥杯杂感。
    CF502C The Phone Number
    It's a secret
    2017-06-22
    2017-05-12
  • 原文地址:https://www.cnblogs.com/xl1164191281/p/4676430.html
Copyright © 2020-2023  润新知