1 条题解

  • 0
    @ 2025-8-24 22:18:02

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Warriors_Cat
    欢迎来到这方净土,这里曾有一位普通人建造着自己的乌托邦。

    搬运于2025-08-24 22:18:02,当前版本为作者最后更新于2020-03-02 12:11:51,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题解 P6160 【[Cnoi2020]向量】

    Solution:Solution:

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

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

    这道题主要还是推式子。

    我们可以得到这些东东:

    ab+bc+ca\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) $$

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

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

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

    i.  r1+r2>r3i.\;r_1+r_2> r_3,那么 a,b,c\vec a, \vec b, \vec c 就可以围成一个类似于三角形的东东,根据平行四边形法则可以得到 a+b+c=0|\vec a+\vec b+\vec c|=0。由于有平方,所以这个肯定是最小值。

    i.  r1+r2r3i.\;r_1+r_2\le r_3,那么为了让最后答案最小,我们只好让 a+b+c=r3r2r1|\vec a+\vec b+\vec c|=r_3-r_2-r_1,这是这种情况最小的答案。

    然后这道题就做出来啦0^_^0。

    Code: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

    • 1

    信息

    ID
    4909
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者