Step 0 三维空间两点距离
距离 =
代码实现:
double d(int a,int b) { return (double)sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] -y [b]) * (y[a] - y[b]) + (z[a] - z[b]) * (z[a] - z[b]));}
Stpe 1 解题思路
1. 第一次发射消息时必定不会撞击;
2. 第二次发射消息时一定会相撞;
3. 由图可以发现答案就是除了第一个星球外的其他两颗星球与第一颗星球组成的三角形(三角体?) 的最小值;
4. 考虑到 可以直接
暴力枚举;
Step 2 AC code
#include <bits/stdc++.h>
long long n;
double ans = 9999999,x[5005],y[5005],z[5005];
double Min(double a,double b) {return a<b?a:b;}
double d(int a,int b) { return (double)sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] -y [b]) * (y[a] - y[b]) + (z[a] - z[b]) * (z[a] - z[b]));}
double juli(int s1, int s2){return d(s1,s2) + d(1,s1) + d(1,s2);}
int main() {
scanf("%lld",&n);
for(int i = 1; i <= n; i++) scanf("%lf %lf %lf",&x[i],&y[i],&z[i]);
for(int i = 3; i <= n; i++)
for(int j = 2; j < i; j++)
ans=Min(ans,juli(i,j));
printf("%.6lf",ans/2);
return 0;
}