YKpages

ロボット分野で勉強したことのまとめ

AtCoder Beginner Contest 144 D - 今日から始める競プロ日記

はじめに

AtCoder Beginner Contest 144 D問題が解けなかったので、 解説動画を見ながらまとめていく。

atcoder.jp

www.youtube.com

D - Water Bottle

  • 底面が a[cm] の正方形、高さが b[cm] の水筒がある
  • 水筒に体積 x[cm3] の水を入れる
  • 水筒を傾けたときに水がこぼれる角度を求める

解き方

まず二次元にして考える(これはできた)。

水の面積は

s [cm^2] = x [cm^3] / a [cm^2]

f:id:kato_robotics:20191028004426p:plain
abc144_d1

水筒を傾けて水がこぼれ始めるパターンは二つに分けられる。

f:id:kato_robotics:20191028011306p:plain
abc144_d2

分け方は面積 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;
}

おわりに

場合分けができなかった。悲しい。

今日から始める競プロ日記まとめ

kato-robotics.hatenablog.com