The Dole Queue
Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown
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 函数非常精炼,是解题的关键。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。