【题解】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;
} 

后记

世界的法则...

原文地址:https://www.cnblogs.com/-SingerCoder/p/13269676.html