The Dole Queue

Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown

UVa 133


https://uva.onlinejudge.org/i...

Accepted Code

// Author : Weihao Long
// Created : 2017/12/23

#include "stdio.h"

#define MAX 25

int n, k, m, a[MAX];

int go(int p, int d, int t) {
    while (t--) {
        do {
            p = (p + d + n - 1) % n + 1;
        } while (a[p] == 0);
    }
    return p;
}

int main() {
    while (scanf("%d%d%d", &n, &k, &m) != EOF) {
        if (n == 0)
            break;
        for (int i = 1; i <= n; i++)
            a[i] = i;
        int left = n;
        int p1 = n, p2 = 1;
        while (left) {
            p1 = go(p1, 1, k);
            p2 = go(p2, -1, m);
            printf("%3d", p1);
            left--;
            if (p2 != p1) {
                printf("%3d", p2);
                left--;
            }
            a[p1] = a[p2] = 0;
            if (left) {
                printf(",");
            }
        }
        printf("\n");
    }
    return 0;
}

Notes

题意:
n 个人站成一圈,逆时针编号为 1~n 。有两个人,A 从 1 开始逆时针数,B 从 n 开始顺时针数。在每一轮中,A 数 k 个就停下来,B 数 m 个就停下来(注意两人可能数到同一个人)。接下来被选中的人( 1 个或 2 个)离开队伍.

思路:
先让 A 和 B 指好,接着把 A 所指的人剔除(编号置为 '0'),若 B 所指的和 A 不同,就再把 B 所指的人剔除。

感受:
代码中的 go 函数非常精炼,是解题的关键。


龙威昊
4 声望5 粉丝