[ICPC2020上海L] Sum of Log - 結論
阿新 • • 發佈:2020-12-14
[ICPC2020上海L] Sum of Log - 結論
Description
給定一張網格圖,從 \((0,0)\) 走到 \((n,m)\),每次可以沿著直線走,從一個格點到另一個格點,中間不能穿過其它格點,不能連續兩次走同樣的方向,求最短路程。
Solution
兩個點之間最多經過一箇中轉點
中轉點一定在起點終點所連直線附近
實際上連 GCD 都不用每次判斷,因為 AC + BC 最小的地方一定滿足互質條件(否則那個經過的整點的答案一定會更小)
#include <bits/stdc++.h> using namespace std; #define int long long double calc(double x, double y) { return sqrt(x * x + y * y); } signed main() { ios::sync_with_stdio(false); int T; cin >> T; while (T--) { int n, m; cin >> n >> m; double ans = n + m; if (__gcd(n, m) == 1) { ans = min(ans, calc(n, m)); } else { for (int i = 1; i <= n; i++) { int t = (i * m - 1) / n; if (t >= 0 && t <= m) ans = min(ans, calc(i, t) + calc(n - i, m - t)); } } cout << setiosflags(ios::fixed) << setprecision(10) << ans << endl; } }