CF44D Hyperdrive 题解

题目传送门

Step 0 三维空间两点距离

距离 $c$ = $\sqrt{(x_a - x_b)^2 + (y_a - y_b)^2 + (y_a - y_b)^2}$

代码实现:

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. 由图可以发现答案就是除了第一个星球外的其他两颗星球与第一颗星球组成的三角形(三角体?)$\div 2$ 的最小值;
4. 考虑到 $3 \le n \le 5000$  可以直接 $O(n^2)$ 暴力枚举;

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值