DISCO presents ディスカバリーチャンネル コードコンテスト2016 予選: B - ステップカット

,

http://ddcc2016-qual.contest.atcoder.jp/tasks/ddcc_2016_qual_b

誤読した。問題分が長くて面倒な感じだったから適当に読んだのが原因。今年は大きい枠に入ってるのでこれでも通るしunratedだから被害はなかったが要反省。

solution

指定されたことを実装するだけ。三角関数の基本的な知識を使う。$O(N)$。

implementation

#include <cstdio>
#include <algorithm>
#include <cmath>
#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))
using namespace std;
int main() {
    int r, n, m; ; scanf("%d%d%d", &r, &n, &m);
    auto l = [&](int i) {
        double sine = 0 <= i and i <= n ? 1 - 2*i /(double) n : 1;
        return 2*r * sqrt(1 - pow(sine, 2));
    };
    double ans = 0;
    repeat (i, n+m) ans += max(l(i-m), l(i));
    printf("%.12lf\n", ans);
    return 0;
}