• 2015 HUAS Summer Training#2 C


    题目:

    Description

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

    Input

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

    Output

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

    解题思路:用一个循环排除2的,一个循环排除3的。

    代码:

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 const int maxn=5000+10;
     5 int main()
     6 {
     7     int n,cur,i,N,j,k;
     8     int a[maxn],s[maxn],b[maxn];
     9       cin>>n;
    10         while(n--)
    11         {
    12             cin>>N;
    13             for(i=0;i<N;i++)
    14             {
    15                 a[i]=i+1;
    16                 b[i]=0;
    17             }
    18             if(N>3)
    19             {
    20                 k=N;
    21                 while(1)
    22                 {
    23                     memcpy(s,b,sizeof(s));
    24                     for(i=1,cur=2;cur<k;i++,cur+=2)
    25                     {    
    26                         s[0]=a[0];             
    27                         s[i]=a[cur];
    28                     }
    29                     i=0;
    30                     for(j=0;j<N;j++)
    31                     {
    32                         if(s[j]!=0)
    33                             i++;
    34                         else break;
    35                     }
    36                     if(i<=3)
    37                     {
    38                         for(j=0;j<i;j++)
    39                         {
    40                             
    41                             if(j==i-1)
    42                                 cout<<s[j]<<endl;
    43                             else 
    44                                 cout<<s[j]<<" ";
    45                         }
    46                         break;
    47                     }
    48                     memcpy(a,b,sizeof(a));
    49                     for(k=0,cur=0;cur<i;k++,cur++)
    50                     {
    51                         if((cur+1)%3==0)
    52                             cur++;
    53                         a[k]=s[cur];
    54                     }
    55                     k=0;
    56                     for(j=0;j<N;j++)
    57                     {
    58                         if(a[j]!=0)
    59                             k++;
    60                         else break;
    61                     }
    62                     if(k<=3)
    63                     {
    64                         for(j=0;j<k;j++)
    65                         {
    66                             if(j==k-1)
    67                                 cout<<a[j]<<endl;
    68                             else 
    69                                 cout<<a[j]<<" ";
    70                         }
    71                         break;
    72                     }
    73                 }
    74             }
    75             else 
    76             {
    77                 for(i=0;i<N;i++)
    78                 {
    79                     if(i==N-1)
    80                         cout<<a[i]<<endl;
    81                     else cout<<a[i]<<" ";
    82                 }
    83             }
    84         }
    85         return 0;
    86 }
     
  • 相关阅读:
    HTTP Continuation or nonHTTP traffic 数据包
    linuxTcp IP协议栈源码阅读笔记(转)
    使用Windows命令行启动服务
    数据库集群
    ShellExecute
    oracle 中数据库完全导入导出:cmd命令行模式
    理解ORACLE数据库字符集
    asp.net 编码设置
    ShellExecute与ShellExecuteEx的用法
    C++用位运算实现循环移位
  • 原文地址:https://www.cnblogs.com/huaxiangdehenji/p/4674639.html
Copyright © 2020-2023  润新知