算法竞赛入门经典(第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;
}
}