The Dole Queue
Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown
Accepted Code
// Author : Weihao Long// Created : 2017/12/23#include "stdio.h"#define MAX 25int 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 函数非常精炼,是解题的关键。