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

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

AtCoder ABC 142 A - Odds of Oddness (灰色, 100 点)

いい感じの複合問題。この時期の ABC-A としては少し難しめ。

問題概要

正の整数  N が与えられる。

 1 以上  N 以下の整数をランダムに選ぶとき、それが奇数である確率を求めよ。

解法

 1 以上  N 以下の  N 個の整数のうち、奇数の個数を  m とすると、求める確率は

 \displaystyle \frac{m}{N}

となる。よって、奇数の個数  m が求められればよい。

奇数の個数

場合分けして考えてみよう。

  •  N が偶数のとき:奇数は  \frac{N}{2} 個となる
    • たとえば  N = 4 のとき、 1, 2, 3, 4 のうち、奇数は  1, 3 の 2 個
  •  N が奇数のとき:奇数は  \frac{N+1}{2} 個となる
    • たとえば  N = 5 のとき、 1, 2, 3, 4, 5 のうち、奇数は  1, 3, 5 の 3 個

これらをまとめて、C++ では (N + 1) / 2 個と書ける。 N が偶数の場合であっても、小数点以下を切り捨てると  N / 2 に一致することに注意しよう。

コード

さらにコードを書くときには、小数点以下をちゃんと出力するように気をつけよう。

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

int main() {
    int N;
    cin >> N;
    int m = (N + 1) / 2;
    cout << fixed << setprecision(10) << double(m) / N << endl;
}