题目:
提一嘴,这个样例(题目看不懂所以我去看样例)看了我是蒙的,所以我稍微修改了一下题目
原题:这
修改后:这
思路:
其实也很简单,从题目中不难看出要跑最短路。数据中\(N \le 1000\)这样的数据。\(\mathcal{O}(n^3)\)应该可能也许大概是过得了(反正这题是过了),所以咱使用 Floyd 算法。
讲一下 Floyd :
Floyd 算法是一个基于「贪心」、「动态规划」求一个图中所有点到所有点 最短路径的算法,时间复杂度 \(\mathcal{O}(n^3)\)
其重点思想:以每个点为「中转站」,刷新所有「入度」和「出度」的距离。
大家也可以先看看【Clear And Present Danger S】这道板子题。
再看本题,要求求把章鱼小丸子分发给所有人所需时间的最小值,就把两个人传递的时间当作「入度」和「出度」的距离,跑一遍 Floyd 即可。
CODE:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
double x[514850],y[514850],t[514850],r[514850],f[1001][1001],a;
inline void floyd()
{
for(int k=1; k<=n; k++) {
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
f[i][j]=min(f[i][k]+f[k][j],f[i][j]);
}
}
}
}
signed main() {
cin>>n;
for(int i=1; i<=n; i++) {
cin>>x[i]>>y[i]>>t[i]>>r[i];
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
double fx=x[i]-x[j];
double fy=y[i]-y[j];
f[i][j]=sqrt(fx*fx+fy*fy)/min(t[i],r[j]);
}
}
floyd();
sort(f[1]+1,f[1]+n+1);
for(int i=2;i<=n;i++)
a=max(a,f[1][i]+n-i);
printf("%.6lf",a);
return 0;
}