C++の練習を兼ねて, AtCoder Beginner Contest 144 の 問題D (D – Water Bottle) を解いてみた.
■感想.
1. 解説見る前に, AC版となったので良かったと思う.
本家のサイトABC 144解説をご覧下さい.
■C++版プログラム(問題D/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <bits/stdc++.h> using namespace std; int main(){ // 1. 入力情報. double a, b, x; scanf("%lf %lf %lf", &a, &b, &x); // 2. 水筒を傾ける. double pi = acos(-1); // printf("pi=%.10lf\n", pi); double bottle = a * a * b; double theta = 0.0; // 2-1. 側面が台形(水が半分以上: x >= 0.5 * bottle)となる場合. // trapezoid = (a * b) - 0.5 * a * a * tan(θ) // x = a * trapezoid = bottle - 0.5 * a * a * a * tan(θ); // から, 角度を逆算してみる. if(x >= 0.5 * bottle) theta = atan((bottle - x) / (0.5 * a * a * a)) * 180.0 / pi; // 2-2. 側面が直角三角形(水が半分未満: x < 0.5 * bottle)となる場合. // triangle = 0.5 * b * b * tan(90 - θ) // x = a * triangle = 0.5 * a * b * b * tan(90 - θ) if(x < 0.5 * bottle) theta = 90.0 - atan(x / (0.5 * a * b * b)) * 180.0 / pi; // 3. 出力 ~ 後処理. printf("%.10lf\n", theta); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
[入力例] 2 2 4 [出力例] 45.0000000000 ※AtCoderテストケースより [入力例] 12 21 10 [出力例] 89.7834636934 ※AtCoderテストケースより [入力例] 3 1 8 [出力例] 4.2363947991 ※AtCoderテストケースより [入力例] 20 19 1027 [出力例] 74.1196080664 [入力例] 20 19 3800 [出力例] 43.5311992856 [入力例] 20 19 4321 [出力例] 39.3431866727 |
■参照サイト
AtCoder Beginner Contest 144