P6160 [Cnoi2020] 向量

[Cnoi2020] 向量

题目背景

向量(vector),指具有大小(Magnitude)和方向(Direction) 的量。
与向量对应的量叫做数量(Scalar),数量只有大小,没有方向。

对于 Cirno 来说,整天环绕氷屋的旋转 Sangetsusei 们是向量而不是数量。

  • Sunny Milk 以 r 1 r_1 r1 为半径做匀速圆周运动。
  • Luna Child 以 r 2 r_2 r2 为半径做匀加速圆周运动。
  • Star Sapphire 以 r 3 r_3 r3 为半径做变加速圆周运动。

为了尽可能的减小三月精们的影响,一些重要的参数必需被计算。

题目描述

以氷屋为原点,三月精的位置分别记作向量 a ⃗ \vec{a} a , b ⃗ \vec{b} b , c ⃗ \vec{c} c

由定义可知, ∣ a ⃗ ∣ = r 1 |\vec{a}|=r_1 a =r1, ∣ b ⃗ ∣ = r 2 |\vec{b}|=r_2 b =r2, ∣ c ⃗ ∣ = r 3 |\vec{c}|=r_3 c =r3

现在 Cirno 分配给你的任务是计算其 破坏极限指数 σ \sigma σ

σ = min ⁡ { a ⃗ ⋅ b ⃗ + b ⃗ ⋅ c ⃗ + c ⃗ ⋅ a ⃗ } \sigma=\min\{\vec{a}\cdot\vec{b}+\vec{b}\cdot\vec{c}+\vec{c}\cdot\vec{a}\} σ=min{a b +b c +c a }

其中「 ⋅ \cdot 」表示 向量内积

输入格式

一行,三个整数 r 1 r_1 r1, r 2 r_2 r2, r 3 r_3 r3,保证 r 1 ≤ r 2 ≤ r 3 r_1 \le r_2 \le r_3 r1r2r3

输出格式

一行,一个 实数 σ \sigma σ。(小数点后保留一位数字

样例 #1

样例输入 #1

3 4 5

样例输出 #1

-25.0

样例 #2

样例输入 #2

159 473 824

样例输出 #2

-445561.0

提示

Sample1 解释

cos ⁡ ⟨ a ⃗ , b ⃗ ⟩ = 0 , cos ⁡ ⟨ b ⃗ , c ⃗ ⟩ = − 4 5 , cos ⁡ ⟨ c ⃗ , a ⃗ ⟩ = − 3 5 \cos\langle\vec{a},\vec{b}\rangle=0,\cos\langle\vec{b},\vec{c}\rangle=-\frac{4}{5},\cos\langle\vec{c},\vec{a}\rangle=-\frac{3}{5} cosa ,b =0,cosb ,c =54,cosc ,a =53 时答案最小。

后置数学知识

  • 向量内积定义 : a ⃗ ⋅ b ⃗ = ∣ a ⃗ ∣ ∣ b ⃗ ∣ × cos ⁡ ⟨ a ⃗ , b ⃗ ⟩ \vec{a}\cdot\vec{b}=|\vec{a}||\vec{b}|\times \cos\langle\vec{a},\vec{b}\rangle a b =a ∣∣b ×cosa ,b
  • 向量内积坐标表示 : ( x 1 , y 1 ) ⋅ ( x 2 , y 2 ) = x 1 x 2 + y 1 y 2 (x_1,y_1)\cdot(x_2,y_2)=x_1x_2+y_1y_2 (x1,y1)(x2,y2)=x1x2+y1y2

数据范围约定

「本题采用捆绑测试」

  • Subtask1( 20 % 20\% 20% ) : r 1 = r 2 = r 3 r_1=r_2=r_3 r1=r2=r3
  • Subtask2( 40 % 40\% 40% ) : r 1 , r 2 , r 3 ≤ 10 r_1,r_2,r_3 \le 10 r1,r2,r310
  • Subtask3( 40 % 40\% 40% ) : r 1 , r 2 , r 3 ≤ 1 0 9 r_1,r_2,r_3 \le 10^9 r1,r2,r3109

对于 100 % 100\% 100% 的数据 0 < r 1 ≤ r 2 ≤ r 3 ≤ 1 0 9 0 < r_1 \le r_2 \le r_3 \le 10^9 0<r1r2r3109

这个题涉及的是数学知识,向量,三角函数之类的。先来看一下,通过三元完全平方和转化后的式子:
三元完全平方和
可知后半部分为定值,根据向量的知识,三角形的三边向量相加可以=0,

由于精度问题,这里要用long double

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long double a,b,c;
	cin>>a>>b>>c;
	if(a+b>c)
	printf("%.1Lf",-(a*a+b*b+c*c)/2);
	else
	printf("%.1Lf",((c-a-b)*(c-a-b)-a*a-b*b-c*c)/2);
}

代码很简单,纯数学

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值