Toy と帽子と ADP BE

主にプログラミングに関わる話をゆるくエモくやっていきます

B. JOE is on TV! (Codeforces Round #614 Div. 2)

こっちを先にやるべきでした。こどふぉは、最初にAとB両方見ておくべき。

問題

https://codeforces.com/contest/1293/problem/B

問題概要

n人がゲームに参加します。ゲームはターン制で、1ターン毎に何名かが退場させられます。各ターン毎に勝ち残った人は、そのターンの参加者をs人、退場者をt人としてt/sドルの賞金がもらえます。

最後の一人に勝ち残ったとして、得られる金額の最大値はいくらになりますか?

解法

一人ずつ退場していって、1 / n + 1 / (n - 1) + ... + 1 / 2 + 1 / 1となるのが一番高いです。(a - 1) / a1 / a + 1 / (a - 1) (a > 1)ではどちらが大きくなるか考えてみればわかります。

というわけで、実装としては1からsまでループを回して、1 / iを足し続ければいいということになります。

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

int main() {
    int n;
    cin >> n;
    double ans = 0;
    for (int i = 1; i <= n; i++;) {
        ans += 1.0 / i;
    }
    cout << ans << endl;
}