问题标题: 酷町堂:5604 出队游戏(queue)

0
0
已解决
张恩泽
张恩泽
高级天翼
高级天翼

5604   出队游戏(queue)

经验值:1200 时间限制:1000毫秒

合肥市第37届信息学竞赛

不许抄袭,一旦发现,直接清空经验!

题目描述 Description

秋冬季阳光明媚的上午,老师带领同学们在做一个游戏,首先同学们排成一列,然后从1开始依次给同学们一个编号,如果有5位同学,他们的编号依次为1、2、3、4、5。游戏规则如下:

  1. 从队头开始依次按一、二、一、二、……报数,凡是报到数为二的出来;
  2. 剩余的同学依次靠拢重新排成一列,从队头开始依次按一、二、三、一、二、三、……报数,凡是报到数为三的出来;
  3. 重复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表示出队了)

我要回答