AtCoder Beginner Contest 144 D - 今日から始める競プロ日記
はじめに
AtCoder Beginner Contest 144 D問題が解けなかったので、 解説動画を見ながらまとめていく。
D - Water Bottle
- 底面が a[cm] の正方形、高さが b[cm] の水筒がある
- 水筒に体積 x[cm3] の水を入れる
- 水筒を傾けたときに水がこぼれる角度を求める
解き方
まず二次元にして考える(これはできた)。
水の面積は
s [cm^2] = x [cm^3] / a [cm^2]
水筒を傾けて水がこぼれ始めるパターンは二つに分けられる。
分け方は面積 S が ab/2
(水筒の半分)より大きいか小さいかで決められる。
コード
解説動画を参考に書いたコード
#include <bits/stdc++.h> using namespace std; int main() { // 入力 double a, b, x; cin >> a >> b >> x; // 二次元で考えて面積を求める double s = x/a; // atan2で角度(ラジアン)を求める double rad; // 水が水筒の半分以上の場合 if(s >= a*b/2) { double h = 2*(a*b-s)/a; rad = atan2(h,a); } // 水が水筒の半分以下の場合 else { double w = s*2/b; rad = atan2(b,w); } // ラジアンを度に変換 double PI = acos(-1); double deg = rad/(2*PI)*360; // 解を出力 cout << fixed << setprecision(10) << deg << endl; return 0; }
おわりに
場合分けができなかった。悲しい。