hdoj--1276--士兵队列训练问题(数组模拟)
2024-08-24 08:51:34
士兵队列训练问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4783 Accepted Submission(s): 2240
Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2
20
40
Sample Output
1 7 19
1 19 37
Author
Cai Minglun
Source
Recommend
#include<stdio.h>
#include<string.h>
int num[10000+10];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);//输入的数如果在3以内就不会进入循环,所以直接输出
if(n==1) printf("1\n");
else if(n==2) printf("1 2\n");
else if(n==3) printf("1 2 3\n");
else
{
memset(num,0,sizeof(num));//标记数组清零
int ans=n,cnt=0;
int s;
while(true)
{
if(ans<=3) break;
int j=1;
if(cnt%2==0) s=2;
else s=3;
//判断当前是除以2还是3,cnt相当于计数变量,记录圈数
cnt++;
for(int i=1;i<=n;i++)
{
if(!num[i])
{
if(j%s==0)
{
num[i]=1;ans--;j=1;
//是s的倍数的话就要出队,人数减一,标记
}
else j++;
}
}
}
int b[4];
int j=0;
for(int i=1;i<=n;i++)
{
if(!num[i])
{
b[j++]=i;//因为有输出格式的限制,所以先把数据取出来
}
}
printf("%d",b[0]);
for(int i=1;i<ans;i++)
printf(" %d",b[i]);
printf("\n");
}
}
return 0;
}
最新文章
- Oracle学习笔记十三 触发器
- mysql中You can&#39;t specify target table for update in FROM clause错误
- WPF ComboBox Binding
- ligerui_ligerTree_004_对";ligerTree";节点操作
- php经典笔试题
- json处理复杂对象jsonConfig
- Linux下动态调整LVM文件系统大小
- mysql表结构设计
- Oracle SQL自带函数整理
- PHP实反向代理-收藏
- DOM 和 BOM 的 对象 和方法
- 【学习】js学习笔记:数组(二)
- 什么是 core dump ? 以及如何使用gdb对 core dumped 进行调试
- Eclipse中快速打开文件所在的文件夹位置
- 第三次作业 (一)----------------------Visual Studio 2015的安装及单元测试
- uigrid配置详解(1)
- flask操作mongo两种方式--ORM
- FreeRTOS基础知识
- iOS:关于UIView切角的两种实现方式
- ERROR 2002 (HY000): Can&#39;t connect to local MySQL server through socket &#39;/var/run/mysqld/mysqld.sock&#39; (2)-mysql.sock丢失解决方案