题解p6160 [Cnoi2020]向量
Posted -singercoder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解p6160 [Cnoi2020]向量相关的知识,希望对你有一定的参考价值。
序
啊又是勤奋学习的一天......
这种mo题目能做出来纯靠感觉。
样例分析
样例输入给了组3、4、5的勾股数,而输出正好是三向量加和为0时的答案。
嗯我好像感觉到了什么......
于是用余弦定理计算三个角出内积,再特判一下两边之和小于等于第三边:
#include<bits/stdc++.h>
#define db double//~~卡double差评~~
#define sqr(x) ((x)*(x))
using namespace std;
long double a,b,c,cA,cB,cC;
void Sort()
{
if(a>b)swap(a,b);
if(b>c)swap(b,c);
if(a>b)swap(a,b);
}
int main()
{
// freopen("in.in","r",stdin);
scanf("%Lf %Lf %Lf",&a,&b,&c);
Sort();
if(a+b<=c){cA=-1;cB=-1;cC=1;}
else
{
cA=-(sqr(b)+sqr(c)-sqr(a))/(2*b*c);
cB=-(sqr(a)+sqr(c)-sqr(b))/(2*a*c);
cC=-(sqr(a)+sqr(b)-sqr(c))/(2*a*b);
}
printf("%.1Lf
",a*b*cC+b*c*cA+c*a*cB);
return 0;
}
事实证明结论蒙对了。
正面证明
试着将内积拆分成单个向量。
下文(a,b,c)均代指向量,且(c)模长最大。
由((a+b+c)^2=a^2+b^2+c^2+2ab+2bc+2ca)
得(ab+bc+ca={1over2}((a+b+c)^2-(a^2+b^2+c^2)))
(a^2+b^2+c^2)为定值,我们考虑令((a+b+c)^2)最小
当(|a|+|b|le|c|),((a+b+c)^2_{min}=(|c|-|a|-|b|)^2)
当(|a|+|b|>|c|),构成三角形即可,((a+b+c)^2_{min}=0)
#include<cstdio>
#define db double
#define sqr(x) ((x)*(x))
using namespace std;
long double a,b,c;
int main()
{
// freopen("in.in","r",stdin);
scanf("%Lf %Lf %Lf",&a,&b,&c);
if(a+b<=c)printf("%.1Lf",0.5*(sqr(c-a-b)-sqr(a)-sqr(b)-sqr(c)));
else printf("%.1Lf",0.5*(-sqr(a)-sqr(b)-sqr(c)));
return 0;
}
后记
世界的法则...
以上是关于题解p6160 [Cnoi2020]向量的主要内容,如果未能解决你的问题,请参考以下文章
P5385 [Cnoi2019]须臾幻境 / #3514. Codechef MARCH14 GERALD07加强版 [LCT + 主席树]
[BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)