DISCO presents ディスカバリーチャンネル コードコンテスト2016 予選: 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;
}