HDU1276 士兵队列训练问题

士兵队列训练问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 3356    Accepted Submission(s): 1552

Problem Description

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

Input

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

Output

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

Sample Input

2
20
40

Sample Output

1 7 19
1 19 37
#include <stdio.h>
#include <string.h>
bool arr[5002];
int n, ans;

int getNext(int i){
	while(arr[i] == 0 && i <= n) ++i;
	return i;
}

void cal2(){
	if(ans <= 3) return;
	for(int pos = 0; pos <= n; ){
		pos = getNext(pos + 1);
		if(pos > n) return;
		pos = getNext(pos + 1);
		if(pos > n) return;
		arr[pos] = 0;
		--ans;
	}
}

void cal3(){
	if(ans <= 3) return;
	for(int pos = 0; pos <= n; ){
		pos = getNext(pos + 1);
		if(pos > n) return;
		pos = getNext(pos + 1);
		if(pos > n) return;
		pos = getNext(pos + 1);
		if(pos > n) return;
		arr[pos] = 0;
		--ans;
	}
}

int main(){
	int t, flag;
	scanf("%d", &t);
	while(t--){
		scanf("%d", &n);
		ans = n;
		for(int i = 1; i <= n; ++i)
			arr[i] = 1;
		while(ans > 3){
			cal2();
			cal3();
		}
		flag = 0;
		for(int i = 0; ;){
			i = getNext(i + 1);
			if(i > n) break;
			if(flag == 0) flag = 1, printf("%d", i);
			else printf(" %d", i);
		}
		printf("\n");
	}
	return 0;
}

HDU1276 士兵队列训练问题,布布扣,bubuko.com

时间: 2024-08-04 20:36:06

HDU1276 士兵队列训练问题的相关文章

hdu1276士兵队列训练问题[简单STL list]

目录 题目地址 题干 代码和解释 题目地址 hdu1276 题干 代码和解释 本题使用了STL中的list,STL的list是双向链表.它的内存空间不必连续,通过指针来进行数据的访问,高效率地在任意地方删除和插入,插入和删除操作时常数时间.list和vector的优缺点正好相反,它们的应用场景不同: (1)vector:插入和删除操作少,随机访问元素频繁 (2)list:插入和删除频繁,随机访问较少. 使用链表list时,我们需要用到迭代器.比如本题的代码中,list的类型是int,所以我们定义

HDU 1276 士兵队列训练问题(模拟)

原题代号:HDU 1276 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1276 题目原题: 士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8914    Accepted Submission(s): 3940 Problem Description 某部队进行新兵队

士兵队列训练问题(杭电1276)

/*士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3585    Accepted Submission(s): 1674 Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开

用链表实现轻院1276士兵队列训练问题

士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8554    Accepted Submission(s): 3809 Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行

HDU 1279 士兵队列训练问题

士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4602    Accepted Submission(s): 2145 Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进

hdoj 1276 士兵队列训练问题【模拟】

士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4558    Accepted Submission(s): 2125 Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行

Week 1 # G 士兵队列训练问题

原题描述: G - 士兵队列训练问题 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数...,以后从头开始轮流进行一至二报数.一至三报数直到剩下的人数不超过三人为止. Input 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000. Output 共有N行,分别对应输入的新兵人数

(hdu step 8.1.6)士兵队列训练问题(数据结构,简单模拟——第一次每2个去掉1个,第二次每3个去掉1个.知道队伍中的人数&lt;=3,输出剩下的人 )

题目: 士兵队列训练问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 56 Accepted Submission(s): 37   Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三

Problem1276 士兵队列训练问题

士兵队列训练问题 http://acm.hdu.edu.cn/showproblem.php?pid=1276 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12841    Accepted Submission(s): 5641 Problem Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行