[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 r1≤r2≤r3。
输出格式
一行,一个 实数 σ \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} cos⟨a,b⟩=0,cos⟨b,c⟩=−54,cos⟨c,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∣×cos⟨a,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,r3≤10
- Subtask3( 40 % 40\% 40% ) : r 1 , r 2 , r 3 ≤ 1 0 9 r_1,r_2,r_3 \le 10^9 r1,r2,r3≤109
对于 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<r1≤r2≤r3≤109
这个题涉及的是数学知识,向量,三角函数之类的。先来看一下,通过
三元完全平方和
转化后的式子:
可知后半部分为定值,根据向量的知识,三角形的三边向量相加可以=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);
}
代码很简单,纯数学