zoukankan      html  css  js  c++  java
  • uva 133

    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

     1 #include<iostream>  
     2 #include<string.h>  
     3 #include<stdio.h>  
     4 #include<ctype.h>  
     5 #include<algorithm>  
     6 #include<stack>  
     7 #include<queue>  
     8 #include<set>  
     9 #include<math.h>  
    10 #include<vector>  
    11 #include<map>  
    12 #include<deque>  
    13 #include<list>  
    14 using namespace std;  
    15 #define maxn 25
    16 int n,k,m,a[maxn];
    17 int go(int p,int d,int t)//构建走动函数,跳过数值为0的位置 
    18 {
    19     while(t--)
    20     {
    21         do
    22         {
    23             p=(p+d+n-1)%n+1;
    24         }
    25         while(a[p]==0);
    26     }
    27     return p;
    28 } 
    29 int main()
    30 {
    31     while(scanf("%d%d%d",&n,&k,&m)==3&&n)
    32     {
    33         for(int i=1;i<=n;i++)
    34         a[i]=i;
    35         int left =n;
    36         int p1=n,p2=1;//初始化移动位置,逆时针用p1,顺时针用p2
    37         while(left)
    38         {
    39             p1=go(p1,1,k);
    40             p2=go(p2,-1,m);
    41             printf("%d",p1);
    42             left--;
    43             if(p1!=p2)
    44             {
    45                  printf(" %d",p2);
    46                  left--;
    47             }
    48             if(left)
    49             printf(",");
    50             a[p1]=a[p2]=0;;
    51         } 
    52         printf("
    ");
    53     }
    54     return 0;
    55 }
    View Code
  • 相关阅读:
    HDU 5642 King's Order 动态规划
    HDU 5640 King's Cake GCD
    HDU 5641 King's Phone 模拟
    HDU 5299 Circles Game 博弈论 暴力
    HDU 5294 Tricks Device 网络流 最短路
    HDU 5289 Assignment rmq
    HDU 5288 OO’s Sequence 水题
    星际争霸 虚空之遗 人族5BB 操作流程
    Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列
    Codeforces Beta Round #3 C. Tic-tac-toe 模拟题
  • 原文地址:https://www.cnblogs.com/qscqesze/p/3850467.html
Copyright © 2011-2022 走看看