こっちを先にやるべきでした。こどふぉは、最初に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) / a
と1 / 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; }