题目背景
现在是2048年,小A正在VR虚拟机上刷题。
题目描述
小A刷到了一个题:
给出一个三角形(ABC),你需要找到任意一个点(O),使得 (3OA + 2OB + OC) 最小。
小A打了太多游戏,思维钝化不会做了,你能帮帮他吗?
输入格式
输入六个 五位小数 (x0,y0,x1,y1,x2,y2),分别表示点(A)的横纵坐标、点(B)的横纵坐标、点(C)的横纵坐标。保证这三个点构成一个三角形。
输出格式
输出一行两个 五位小数(四舍五入),表示点(O)的横纵坐标。
输入输出样例
输入
0.00000 0.00000
1.00000 0.00000
0.00000 1.00000
输出
0.00000 0.00000
说明/提示
数据范围
子任务编号 | 时限 | 空限 | 分值 | |
---|---|---|---|---|
subtask1 | 1000ms | 128MB | 30 | |
subtask2 | 1000ms | 128MB | 70 |
数据保证最优的点O的坐标也在 (x,y) 的范围内。
题解
- 本题可以当做思维题,同班大佬一下子就想到了输出第一个点,而蒟蒻的我只能一点点的证明,在老师的帮助下,终于有所收获。
- 这道题是直接输出 (A) 点,但是为什么呢,下面给出证明。
[ecause OA + OB geq AB\
ecause OA + OB geq AB\
ecause OA + OC geq AC\
herefore 3OA + 2OB + OC geq 2AB + AC\
herefore OA+OC+2(OA+OB) geq 2AB + AC\
]
- 由此显然只有(O)与(A)重合时取 (=),
- 否则
- 若(O)在(AB)上,(OA + OB = AB) , (OA + OC > AC)
- 若(O)不在(AB)上,(OA + OB > AB) , (OA + OC geq AC)
- 所以code代码很好写啦。
code
#include <bits/stdc++.h>
using namespace std;
int main(){
string a,b;
cin>>a>>b;
cout<<a<<" "<<b;
}