UVA-133 The Dole Queue

来源:互联网 发布:linux软件下载 编辑:程序博客网 时间:2024/06/08 09:00

2016-08-18

UVA - 133 The Dole Queue

题目大意:N 个人围成环逆时针编号,逆时针从 1 开始数第 k 个出列,顺时针从 N 开始数第 m 个人出列,若数到同一个人,出列一次。下一轮从当前位置开始数,直至所有人出列。输出编号,宽度 3。

解题思路:编号,循环查找,下标到 0 时改为 N,为 N+1 时改为 1,使数组头尾连接。出列后编号改为 0,计数时跳过。

注意:要两个都找到再判断是否相同,输出。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int que[25];int main() {int N, k, m;while ( ~scanf("%d%d%d", &N, &k, &m) ) {int flag = N;if ( !N && !k && !m )break;memset (que, 0, sizeof(que));for (int i = 1; i <= N; i++)que[i] = i;int a = 1, b = N;while (1) {while ( !que[a] ) {a++;if ( a == N+1 )a = 1;}while ( !que[b] ) {b--;if ( b == 0 )b = N;}for (int i = 1; i < k; i++) {a++;if ( a == N+1 )a = 1;if ( !que[a] )i--;}for (int i = 1; i < m; i++) {b--;if ( b == 0 )b = N;if ( !que[b] )i--;}if ( b != a ) {printf("%3d%3d", que[a], que[b]);que[a] = 0;que[b] = 0;flag -= 2;}if ( a == b ) {printf("%3d", que[a]);que[a] = 0;flag--;}if ( flag )cout << ",";elsebreak;}cout << endl;}return 0;}


0 0