問題文
解答例
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
int n = scanner.nextInt();
int m = scanner.nextInt();
for (int i = 0; i < m; i++) {
int w = scanner.nextInt();
int result = w / n * n;
if (result == 0) {
result = n;
} else if ((w - result) >= (result + n - w)) {
result += n;
}
System.out.println(result);
}
}
}
}
補足
公式の解答例だと愚直に箱の候補を作成してどれに一番近いか、みたいなのをチェックしている。分かりやすさで言えばこれのほうが良いと思うが、箱の候補が増えていくと計算時間に問題が出てくると思うので、一応解答例では別のものを作成した。
-
w / n * n
を計算する。ひとまずこれの計算結果で箱がx * n
か(x + 1) * n
まで絞り込める -
w / n * n
の結果が0だった場合は(問題文の制限により0の箱には振り分けられないため)自動的に答えはnになる -
(w - result) >= (result + n - w)
の部分でx * n
と(x + 1) * n
のうちどちらのほうに近いかをチェックしている
ものすごいざっくりとした解説を書いたが、自分でも説明が分かりづらい。普通に公式の解答例を参考にしたほうがいいかも……