🙌
ABC 183 | B - Billiards
問題
考えたこと
次に
上記のときの点を
コード
実装時のTips
- 出力で小数点12桁まで出すために
cout << fixed << std::setprecision(12)
を利用している - 結果が小数点のときもあるので
long double
を使っている
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
using ld = long double;
using uint = unsigned int;
using ull = unsigned long long;
const int MOD = 1e9 + 7;
int main() {
cout << fixed << std::setprecision(12);
ld sx, sy, gx, gy;
cin >> sx >> sy >> gx >> gy;
if (sx == gx) {
cout << sx << endl;
return 0;
}
if (sx < gx) {
swap(sx, gx);
swap(sy, gy);
}
ld left = gx;
ld right = sx;
ll cnt = 100;
while (cnt) {
ld mid = (left + right) / 2;
ld a = sy / (sx - mid);
ld b = gy / (mid - gx);
if (a < b) {
left = mid;
} else {
right = mid;
}
cnt--;
}
cout << left << endl;
return 0;
}
別解
二分探索をしていたが以下のように等号で置き換え
よってコードは以下のようになる。
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
using ld = long double;
using uint = unsigned int;
using ull = unsigned long long;
const int MOD = 1e9 + 7;
int main() {
cout << fixed << std::setprecision(12);
ld sx, sy, gx, gy;
cin >> sx >> sy >> gx >> gy;
if (sx == gx) {
cout << sx << endl;
return 0;
}
if (sx < gx) {
swap(sx, gx);
swap(sy, gy);
}
ld ans = (sx * gy + gx * sy) / (sy + gy);
cout << ans << endl;
return 0;
}
Discussion