演算法競賽入門經典(第2版)救濟金髮放(The Dole Queue,UVa133)
阿新 • • 發佈:2018-12-26
演算法競賽入門經典(第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;
}
}