AT279 题解

题目:

提一嘴,这个样例(题目看不懂所以我去看样例)看了我是蒙的,所以我稍微修改了一下题目
原题:
修改后:

思路:

其实也很简单,从题目中不难看出要跑最短路。数据中\(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;
}
上一篇:软件工程第二节课 《springboot 连接 sql数据库,实现 增删改查功能》


下一篇:你的内生性解决方式out, ERM已一统天下而独领风骚