1. 程式人生 > 實用技巧 >[ICPC2020上海L] Sum of Log - 結論

[ICPC2020上海L] Sum of Log - 結論

[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;
    }
}