• 「LAOI-01」Game Over B


    题目背景

    现在是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
    

    说明/提示

    数据范围

    子任务编号 x,yx, y 时限 空限 分值
    subtask1 0.01x,y0.01-0.01leq x, yleq 0.01 1000ms 128MB 30
    subtask2 109x,y109-10^9leq x,yleq 10^9 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;
    }
    
  • 相关阅读:
    【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树
    【BZOJ4196】[Noi2015]软件包管理器 树链剖分
    【BZOJ4698】Sdoi2008 Sandy的卡片 后缀数组+RMQ
    【BZOJ4278】[ONTAK2015]Tasowanie 后缀数组
    mysql中使用concat例子
    SAP basis 常用事物
    推和敲
    踏和走
    下一个该你啦
    长城:恐惧的纪念碑
  • 原文地址:https://www.cnblogs.com/hellohhy/p/13343117.html
Copyright © 2020-2023  润新知