2016HUAS_ACM暑假集训1A - 士兵队列训练问题

这道题我觉得是个简单的模拟题,整理一下思路,弄清楚题意就好了。

新手上路,采用两个数组进行交互赋值,用的方法也比较笨,思路差不多都在代码的注释里了。

 

下面是题目大意:

首先将士兵从1开始编号(士兵总数不超过5000),然后开始1 2 1 2...报数,报到2的士兵出列,剩下的向小序号方向靠拢,然后按照1 2 3 1 2 3... 报数,报到3的出列。以此类推(1 2 1 2...报数后再1 2 3 1 2 3...报数),直到剩下的士兵人数不超过3人,并且输出他们原来的编号。

格式要求如下:
第一行表示的是一个测试组数N,下面N行是每个案例士兵人数。
 
Sample Input
2
20
40
 
Sample Output
1 7 19
1 19 37 
 1 #include<iostream>
 2 #include<string.h>
 3 using namespace std;
 4 
 5 int n,N,i,j,a[5001],b[5001],c;//我一般比较喜欢定义为全局变量
 6 
 7 int main()
 8 {
 9     cin >> N;
10     while(N--)
11     {
12         memset(a,0,sizeof(a));//初始化一下两个要用到的数组
13         memset(b,0,sizeof(b));
14         cin >> n;
15         for(i=1;i<=n;i++)
16             a[i]=i;//为n个新兵进行编号
17         while(n>3)//人数大于3的时候执行循环内的语句
18         {
19             for(i=1,j=1;i<=n;i++)
20             {
21                 if(i%2!=0)//1 2 1 2...报数导致a数组下标为偶数的全报的2,应当剔除
22                 {
23                     b[j]=a[i];//把a数组内下标为奇数的数放到b数组内
24                     j++;
25                 }
26             }
27             c=j-1;//j在执行完最后一个赋值后,又执行了一次j++,所以留下的士兵应该为j-1
28             if(c<4)//如果满足条件,直接输出,结束此次循环
29             {
30                 for(i=1;i<c;i++)
31                     cout<<b[i]<<' ';
32                 cout<<b[c]<<endl;
33                 break;
34             }
35             for(j=1,i=1;j<=c;j++)//1 2 3 1 2 3...报数
36             {
37                 if(j%3!=0)
38                 {
39                     a[i]=b[j];//把b数组内下标为3的倍数的数放到a数组内
40                     i++;
41                 }
42             }
43             n=i-1;//同上面的c=j-1;
44         }
45         if(n<4)
46         {
47             for(i=1;i<n;i++)
48                 cout<<a[i]<<' ';
49             cout<<a[n]<<endl;
50         }
51     }
52     return 0;
53 }
View Code

 

 

转载于:https://www.cnblogs.com/ankelen/p/5676849.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值