标签:题目 int 题解 AT279 514850 算法 Floyd mathcal
题目:
提一嘴,这个样例(题目看不懂所以我去看样例)看了我是蒙的,所以我稍微修改了一下题目
原题:这
修改后:这
思路:
其实也很简单,从题目中不难看出要跑最短路。数据中\(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;
}
标签:题目,int,题解,AT279,514850,算法,Floyd,mathcal 来源: https://www.cnblogs.com/0-SmartBig-0/p/15863974.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。