1. 程式人生 > >uva 133 發放救濟金

uva 133 發放救濟金

Download as PDF

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).

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).

10 4 3
0 0 0

tex2html_wrap_inline34 4 tex2html_wrap_inline34 8, tex2html_wrap_inline34 9 tex2html_wrap_inline34 5, tex2html_wrap_inline34 3 tex2html_wrap_inline34 1, tex2html_wrap_inline34 2 tex2html_wrap_inline34 6, tex2html_wrap_inline50 10, tex2html_wrap_inline34 7

where tex2html_wrap_inline50 represents a space.

題意:n個人站一圈,編號從1到n,一個人順時針從1開始數,一個人逆時針從n開始數,被數到的人出去這個圈,如果數到同一個人,輸出一次,第二次從接著的位置繼續數,一直數到圈中沒有人為止

#include<stdio.h>
#include<string.h>
int s,n,m;
int a[20],sum;
int shun( int x,int y)
{
    int i;
    for(i=0; i<y; x++ )  //i累計數的次數,x記錄數到的位置
    {
        if(x==s+1)
            x=1;
        if(a[x]!=1)
            i++;

    }
    return x-1; //x在for語句裡面,最後會多加1,注意返回值
}
int ni(int x,int y )
{
    int i;
    for(i=0; i<y; x--)  
    {
        if(x==0) 
            x=s;
        if(a[x]!=1)
            i++;

    }
    return x+1;
}
int main()
{
    while(~scanf("%d%d%d",&s,&n,&m))
    {
        if(!s&&!n&&!m)
            break;
        memset(a,0,sizeof(a));
        int t1=1,t2=s,flag=0;
        sum=0;
        while(sum!=s)
        {
            if(flag)
                printf(",");
            else
                flag=1;
            t1=shun(t1,n);
            t2=ni(t2,m);
            a[t1]=a[t2]=1; //已經出圈的標記為1,注意當兩人都數完時再進行標記,如果先標記一個,會對另一個人數的產生影響
            if (t1 == t2)
            {
                printf("%3d",t1);
                sum++;  //統計圈中剩下人數
            }
            else
            {
                printf("%3d%3d",t1,t2);
                sum+=2;
            }
        }
        printf("\n");
    }
    return 0;
}