問題へのリンク
解答コード
詳細
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
final int N = scanner.nextInt();
final int M = scanner.nextInt();
scanner.close();
int page = (M - 1) / N + 1;
int index = M - (page - 1) * N;
if ((page & 1) == 1) {
page++;
} else {
page--;
}
System.out.println((N * (page - 1)) + (N - index + 1));
}
}
解説
詳細
paizaで重要なのは、コードの記述能力というよりも、どれだけ問題を整理できるかです。
まず、Mが何ページ目の何番目にあるかを考えます。
ページ
・先頭のページを1とすると M から N で割った時、端数切り上げにする必要があります
⇒ M / N だと端数切捨てになってしまいます。切り上げるためには (M - 1) / N + 1 にする必要があります。
閾値(境界線にあたる値)を意識したら気づけます
例1: M = 1 N = 3
1 / 3 ⇒ 0
( 1 - 1 ) / 3 + 1 ⇒ 1
例2:M = 3 N = 3
3 / 3 ⇒ 1
( 3 - 1 ) / 3 + 1 ⇒ 1
例3:M = 4 N = 3
4 / 3 ⇒ 1
( 4 - 1 ) / 3 + 1 ⇒ 2
次にそのページの何番目のポケットに入っているかを計算します
M から N * (page - 1) を引くと良いでしょう
では、page と index を使って目的の数値を求めます
page が奇数の場合、裏面は次のページになります(page++)
page が偶数の場合、裏面が前のページになります(page--)
例ではbit演算で行っていますが(一番右のbitが1なら奇数)2で割って余り0なら偶数です(余り1なら奇数で覚えると、マイナスの時困るので気をつけましょう)
index = 1 の時、裏から見るとポケットは一番右(N)に
index = N の時、裏から見るとポケットは一番左(1)になります
ですのでN - index + 1 番目のポケットに入っていることになります
ですので数字になおすと N * (page- 1) + (N - index + 1 )
になります。
Paizaのコツ
プログラミングのコツは、やりたいことをしっかり分解して、自分のできることに細分化していくことです。
数億行クラスの複雑な処理を行うプログラムも、一行単位なら初心者でもかけるものしか使ってません。
Bランクだと、まだ特殊なアルゴリズムは要求されません。
素直かつ冷静に、コードに落とし込めるよう練習していきましょう。