【题解】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\n",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={1\over2}((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;
}
后记
世界的法则...