您的位置:首页 > 产品设计 > UI/UE

UVa - 133 The Dole Queue

2017-04-05 21:47 363 查看
In a serious attempt to downsize (reduce) the dole queue, The New National Green Labour Rhinoceros Party has decided on the following strategy. Every day all dole applicants will be placed in a large circle, facing inwards. Someone is arbitrarily chosen 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 the end 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 successive pairs (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

最近刚学了c++中的vector容器,它是一个能够存放任意类型的动态数组,能够增加和压缩数据,所以用vector编这道题还不是很难。

解题的思想就是先把每个每个位置都赋值,然后出队的人将其位置的值改为0就好了。

#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

int main(){
int n, m, k;
int A, B;
while(cin >> n >> k >> m){
if(n == 0 && m == 0 && k == 0)
break;
else{
int p1 = 1, p2 = n;
int left = n;
vector<int> a;
vector<int>::iterator p;
vector<int>::iterator p3;
for(int i = 1; i <= n; i++){
a.push_back(i);
}
int aa, bb;
p = a.begin();
p3 = a.end() - 1;
int l = 5;
while(left != 0){
int flagA = 0, flagB = 0;
for(A = 1; ; A++, p++){
if(*p == 0)
A--;
if(A == k){
flagA = *p;
break;
}
if(flagA == 0 && p == a.end() - 1){
p = a.begin() - 1;
}
if(p == a.end() - 1)
break;
}
for(B = 1; ; B++, p3--){
if(*p3 == 0)
B--;
if(p == p3&&B == m){
flagB = *p3;
*p3 = 0;
left--;
break;
}
else if(B == m){
flagB = *p3;
*p = 0;
*p3 = 0;
left -= 2;
break;
}
if(flagB == 0 && p3 == a.begin()){
p3 = a.end();
}
if(p3 == a.begin())
break;
}
if(flagA == flagB){
printf("%3d", flagA);
}
else{
printf("%3d", flagA);
printf("%3d", flagB);
}
if(left != 0)
cout << ",";
}
}
cout << endl;
}
}


编程初学者,代码写的有点乱。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: