当前位置: 首页 > 工具软件 > queue-fun > 使用案例 >

【UVA 133 --- The Dole Queue】模拟

冯永长
2023-12-01

题目来源:点击进入【UVA 133 — The Dole Queue】

Description

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 counterclockwise 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 counterclockwise official first. Separate successive pairs (or singletons) by commas (but there should not be a
trailing comma).
Note: The symbol ⊔ in the Sample Output below represents a space.

Sample Input

10 4 3
0 0 0

Sample Output

␣␣4␣␣8,␣␣9␣␣5,␣␣3␣␣1,␣␣2␣␣6,␣10,␣␣7

解题思路

根据题意模拟即可。
题中有两种方式,实际上是一个+1一个-1所以我们可以将求下一个位置的功能封装成一个函数,传参时一个传+1一个传-1即可。

AC代码:

#include <stdio.h>
#include <string.h>
int n,k,m;
int arr[25];

int fun(int x,int i,int f)
{
    while(x--)
    {
        do
        {
            i=(i+n+f)%n;
        } while (arr[i]==-1);
        
    }
    return i;
}

int main()
{
    while(scanf("%d%d%d",&n,&k,&m),n)
    {
        for(int i=0;i<n;i++) arr[i]=i;
        int num=n,t1=n-1,t2=0;
        while(num)
        {   
            t1=fun(k,t1,1);
            t2=fun(m,t2,-1);
            printf("%3d",t1+1);
            num--;
            if(t1!=t2) printf("%3d",t2+1),num--;
            arr[t1]=arr[t2]=-1;
            if(num) printf(",");
        }
        printf("\n");
    }
    return 0;
}
 类似资料: