1. 程式人生 > >演算法競賽入門經典(第2版)救濟金髮放(The Dole Queue,UVa133)

演算法競賽入門經典(第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; } }