けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 157 A - Duplex Printing (灰色, 100 点)

この切り上げ処理はぜひ憶えておこう!

問題概要

高橋君は、全  N ページから成る書類を両面印刷する。両面印刷では、1 枚の紙に 2 ページ分のデータを印刷することができる。

最小で何枚の紙が必要か求めよ。

解法

 N が偶数のときは、 N は 2 で割り切れて、N / 2 が答えとなる。

 N が奇数のときは、1 ページ余ることになるので、 N に 1 ページ分を足した  N + 1 を 2 で割って、(N + 1) / 2 が答えとなる。

これを if 文で場合分けして AC となるが......

......実は、 N が偶数のときも、(N + 1) / 2 でよいのだ。なぜなら、 N が偶数のときは、1 を足して 2 で割っても、1 余るから商は結局同じなのだ。たとえば、

  •  8 \div 2 = 4
  •  9 \div 2 = 4 あまり 1

というようになる。つまり、8 / 29 / 2 も 4 なのである。

以上から、(N + 1) / 2 を出力すれば AC となる。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;
    cout << (N + 1) / 2 << endl;
}