乱搞

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

Input

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

Output

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

2
20
40

Sample Output

1 7 19
1 19 37

1,直接上代码,解决问题。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
int ren;
cin>>ren;
int sum=0;
int a[5000];  //定义数组必须给出明确的大小
fill(a,a+5000,1);  //未确定的变量不能给未知的变量赋值
for(;;)
{
if(ren-sum<=3) break;  //首先就判断,给出的人数是否是小于3 的情况!!
int num1=2;
for(int j=0;j<ren;j++)
{
if(a[j]==1) num1++;
if(num1%2==0&&a[j]!=0)
{
a[j]=0;
sum++;
}
}
if(ren-sum<=3) break;
int num2=3;
for(int k=0;k<ren;k++)
{
if(a[k]==1) num2++;
if(num2%3==0&&a[k]!=0) //不要出现重复计数的问题
{
a[k]=0;
sum++;
}
}
}
for(int k=0;k<ren;k++)
{
if(a[k]==1&&k!=0)  //格式问题,注意把题目看完,设置一个好的节点
cout<<" ";
if(a[k]==1)
cout<<k+1;
}
cout<<endl;
}
}

 2,代码简单化的问题

  • t 组数据问题

  • 判断问题

 3.输出的格式一定要看好问题的描述或者看示例输出

原文地址:https://www.cnblogs.com/carry-2017/p/7199477.html