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

    后记

    世界的法则...

  • 相关阅读:
    [Android]SharedPreferences
    [Android]XML界面布局常用属性概括
    [Android]XML解析技术
    [Android]Layout标签之-viewStub,requestFocus,merge,include
    [Android]JSON
    [Android]SQLite基本控制台命令简介
    [Android]流文件
    [HTML5]WebSQLDatabase-关系型数据库简介
    [Android]ADB和NavicatLiteSQLDBmanager的数据管理
    [Android]SqliteOpenHelper抽象类实现SQL_DB的管理
  • 原文地址:https://www.cnblogs.com/-SingerCoder/p/13269676.html
Copyright © 2020-2023  润新知