UVa

来源:互联网 发布:数据对接的接口及方式 编辑:程序博客网 时间:2024/06/05 07:36

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;    }}

编程初学者,代码写的有点乱。。。

1 0
原创粉丝点击