UVa 133 - The Dole Queue
2013-02-19 17:57
519 查看
The Dole Queue |
as number 1, and the rest are numbered counter-clockwise up to N (who will be standing on 1's left). Starting from 1 and moving counter-clockwise, one labour official counts off k applicants, while another official starts from N and moves clockwise, counting
m applicants. The two who are chosen are then sent off for retraining; if both officials pick the same person she (he) is sent off to become a politician. Each official then starts counting again at the next available person and the process continues until
no-one is left. Note that the two victims (sorry, trainees) leave the ring simultaneously, so it is possible for one official to count a person already selected by the other official.
Input
Write a program that will successively read in (in that order) the three numbers (N, k and m; k, m > 0, 0 < N < 20) and determine the order in which the applicants are sent off for retraining. Each set of three numbers will be on a separate line and theend of data will be signalled by three zeroes (0 0 0).
Output
For each triplet, output a single line of numbers specifying the order in which people are chosen. Each number should be in a field of 3 characters. For pairs of numbers list the person chosen by the counter-clockwise official first. Separate successivepairs (or singletons) by commas (but there should not be a trailing comma).
Sample input
10 4 3 0 0 0
Sample output
4
8,
9
5,
3
1,
2
6,
10,
7
where
represents a space.
#include <string.h> #include <stdlib.h> #include <stdio.h> int k,m,N; int left[30],right[30]; void deletea (int x) { right[left[x]]=right[x]; left[right[x]]=left[x]; } int main() { while((scanf("%d%d%d",&N,&k,&m))&&N&&k&&m) { for(int i=1;i<=N;i++) { left[i]=(i==1?N:i-1); right[i]=(i==N?1:i+1); } int off1=1,off2=N,p=N; while(p) { int a=k-1,b=m-1; while(a) { off1=right[off1]; a--; } while(b) { off2=left[off2]; b--; } if(off1==off2) { if(p==1) printf("%3d",off1); else printf("%3d,",off1); p--; } else { if(p==2) printf("%3d%3d",off1,off2); else printf("%3d%3d,",off1,off2); p-=2; } deletea (off1); deletea (off2); int off=off1; off1=right[off1];if(off1==off2)off1=right[off1]; off2=left[off2];if(off==off2)off2=left[off2]; } printf("\n"); } }
相关文章推荐
- uva 133 The Dole Queue
- 紫书章四例题3——UVA 133 TheDole Queue
- uva-133 - The Dole Queue
- UVa OJ The Dole Queue 救济金发放 133
- UVa 133 The Dole Queue (模拟循环链表)
- UVa - 133 - The Dole Queue(救济金发放)
- UVA133 The Dole Queue
- 算法竞赛入门经典(第2版)救济金发放(The Dole Queue,UVa133)
- 紫书章四例题3——UVA 133 TheDole Queue
- UVa 133 - The Dole Queue 数据结构专题
- UVA-133 The Dole Queue
- 【模拟】【环形数组】-UVA-133- The Dole Queue
- uva 133 The Dole Queue
- UVA - 133 The Dole Queue
- Uva 133 - The Dole Queue
- UVa 133 - The Dole Queue
- UVA 133 The Dole Queue
- 假期训练——The Dole Queue UVA - 133 模拟
- UVa - 133 The Dole Queue
- uva 133 - The Dole Queue