[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;
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/14135399.html