0
已解决
张恩泽
高级天翼
高级天翼
5604 出队游戏(queue)
经验值:1200 时间限制:1000毫秒
合肥市第37届信息学竞赛
不许抄袭,一旦发现,直接清空经验!
题目描述 Description
秋冬季阳光明媚的上午,老师带领同学们在做一个游戏,首先同学们排成一列,然后从1开始依次给同学们一个编号,如果有5位同学,他们的编号依次为1、2、3、4、5。游戏规则如下:
- 从队头开始依次按一、二、一、二、……报数,凡是报到数为二的出来;
- 剩余的同学依次靠拢重新排成一列,从队头开始依次按一、二、三、一、二、三、……报数,凡是报到数为三的出来;
- 重复1、2,直到剩余的人数不超过3为止。
输入描述 Input Description
输入数据只有一行一个正整数n,表示学生人数
输出描述 Output Description
一行由空格分隔的若干正整数
样例输入 Sample Input
输入样例1: 5 输入样例2: 9
样例输出 Sample Output
输出样例1: 1 3 5 输出样例2: 1 7
数据范围及提示 Data Size & Hint
数据范围:4≤n≤10000
//CODE
//#pragma GCC optimize(3)
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
using namespace std;
int n;
bool vis[10005];
int main() {
// freopen ("题目名.in", "r", stdin);
// freopen ("题目名.out", "w", stdout);
cin >> n;
int res = n;
int pos = 1;
int t;
while (res >= 3) {
while (1) {
if (!vis[pos]) {
t ++;
if (t == 2) {
vis[pos] = true;
res --;
t = 0;
}
}
pos ++;
if (pos == n + 1) {
pos = 1;
break;
}
}
t = 0;
while (1) {
if (!vis[pos]) {
t ++;
if (t == 3) {
vis[pos] = true;
res --;
t = 0;
}
}
pos ++;
if (pos == n + 1) {
pos = 1;
break;
}
}
t = 0;
}
for (int i = 1; i <= n; i ++) {
if (!vis[i]) {
cout << i << ' ';
}
}
// fclose (stdin);
// fclose (stdout);
return 0;//好习惯!
}
0
已采纳
曹灿阳
初级天翼
初级天翼
1. 你的t作为局部变量,还不是输入的数,赋初值时会赋给它一个随机的值,况且你的第一层循环一开始也没有对t进行赋值(在最后赋的,第一次循环会有问题)
2. 所有的t=0应该改为t=1
曹灿阳在2021-07-31 20:59:49追加了内容
变量意义一定要搞清楚,不要想到什么写什么
曹灿阳在2021-07-31 21:25:16追加了内容
你的大while循环中不是有两个小while循环吗?
第一个小while循环和第二个小while循环中间需要判断一下人数是否小于等于3
0
0
王文博
缔造者之神
缔造者之神
AC!!!
这不是重点,重点在于如何AC
其实并没有那么那么那么复杂,就是一个最简单的模拟
核心代码如下:
while(1)
{
if(f==0)
{
int b=0;
for(int i=1;i<=n;i++)
{
if(a[i]==0)
{
b++;
if(b%2==0)
{
a[i]=1;
}
}
}
f=1;
}
else
{
int b=0;
for(int i=1;i<=n;i++)
{
if(a[i]==0)
{
b++;
if(b%3==0)
{
a[i]=1;
}
}
}
f=0;
}
for(int i=1;i<=n;i++)
{
if(a[i]==0) cnt++;
}
if(cnt<=3) break;
cnt=0;
}
记得定义cnt,a[10001],n,f,在main函数外定义!
最后的输出应该会吧!
望采纳!!
(思路:f判断是1、2还是1、2、3,cnt判断队里人的数量、a[i]为0表示没有出队,a[i]为1表示出队了)