题解 P6160 【[Cnoi2020]向量】

· · 题解

题解 P6160 【[Cnoi2020]向量】

Solution:

呜呜呜一道高中题给一个初一蒟蒻做……

比赛结束后问了数学老师就做出来了emmm

这道题主要还是推式子。

我们可以得到这些东东:

\vec a·\vec b+\vec b·\vec c+\vec c·\vec a =\frac{1}{2}(|\vec a+\vec b+\vec c|^2-|\vec a|^2-|\vec b|^2-|\vec c|^2) =\frac{1}{2}(|\vec a+\vec b+\vec c|^2-r_1^2-r_2^2-r_3^2)

因为 r_1,r_2,r_3 均为定值,所以我们只要考虑 |\vec a+\vec b+\vec c|^2 的最小值就可以了QWQ。

那,这个最小值怎么求呢?

那,我们就要分类讨论了。

$i.\;r_1+r_2\le r_3$,那么为了让最后答案最小,我们只好让 $|\vec a+\vec b+\vec c|=r_3-r_2-r_1$,这是这种情况最小的答案。 然后这道题就做出来啦0^_^0。 ### $Code:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
long double ans, a, b, c;
int main(){
    scanf("%Lf%Lf%Lf", &a, &b, &c);
    if(a > b) swap(a, b);
    if(a > c) swap(a, c);
    if(b > c) swap(b, c);//从小到大排序一下。
    ans = (max(c - a - b, (long double)0) * max(c - a - b, (long double)0) - c * c - a * a - b * b) / 2.0;//只是简化一下而已
    printf("%0.1Lf", ans);
    return 0;//完结撒花-v-
}

End