算法竞赛入门经典(第2版)救济金发放(The Dole Queue,UVa133)

算法竞赛入门经典(第2版)救济金发放(The Dole Queue,UVa133

import java.util.Scanner;

/**
 * @author Joker
 */
public class UVa133 {
    /**
     * 思路:将人放入数组中,A数k次,做标记;B数m次,做标记,<br>
     * 遍历数组,将 被数到的人排出(将被数到的人的值变为-1)
     * 
     * @param a
     *            记录A数的人的当前位置。
     * @param b
     *            记录B数的人的当前位置。
     * @param ren
     *            将人放入数组。
     */
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        int m = in.nextInt();
        int a = n - 1;
        int b = 0;
        int[] ren = new int[n];
        for (int i = 0; i < n;) {
            a = go(a, k, 1, ren);
            ren[a]++;
            b = go(b, m, -1, ren);
            ren[b]++;
            for (int j = 0; j < n; j++) {
                if (ren[j] > 0) {
                    System.out.println(j + 1);
                    i++;
                    ren[j] = -1;
                }
            }
        }
    }

    /**
     * 数人方法,只有人的值>=0才会被数,将被数到的人的值++
     * 
     * @param ab
     *            A或B当前所数到的位置
     * @param mk
     *            A或B数的步长,一下数几个人
     * @param f
     *            A或B数的方向,加或减一
     * @param ren
     *            记录人的数组
     * @return 将A的位置返回给A,或将B的位置返回给B
     */
    public static int go(int ab, int mk, int f, int[] ren) {
        for (int i = 0; i < mk;) {
            if (ren[(ab + f + ren.length) % ren.length] >= 0) {
                i++;
                ab = (ab + f + ren.length) % ren.length;
            } else
                ab += f;
        }
        return ab;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36084640/article/details/79255116