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