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

后记

世界的法则...

posted @ 2020-07-08 22:31  _SingerCoder  阅读(230)  评论(2编辑  收藏  举报