版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

仓库源文站点原文


title: "题解 - [Luogu P1337] [JSOI2004] 平衡点 / 吊打XXX" categories:


题目链接

<!-- more -->

原始题面

题目描述

如图: 有 n 个重物, 每个重物系在一条足够长的绳子上. 每条绳子自上而下穿过桌面上的洞, 然后系在一起. 图中 X 处就是公共的绳结. 假设绳子是完全弹性的 (不会造成能量损失), 桌子足够高 (因而重物不会垂到地上), 且忽略所有的摩擦

问绳结 X 最终平衡于何处

注意: 桌面上的洞都比绳结 X 小得多, 所以即使某个重物特别重, 绳结 X 也不可能穿过桌面上的洞掉下来, 最多是卡在某个洞口处

输入输出格式

输入格式

文件的第一行为一个正整数 n (1≤n≤1000), 表示重物和洞的数目. 接下来的 n 行, 每行是 3 个整数: Xi.Yi.Wi, 分别表示第 i 个洞的坐标以及第 i 个重物的重量. (-10000≤x,y≤10000, 0<w≤1000)

输出格式

你的程序必须输出两个浮点数 (保留小数点后三位), 分别表示处于最终平衡状态时绳结 X 的横坐标和纵坐标. 两个数以一个空格隔开

输入输出样例

输入样例 #1

3
0 0 1
0 2 1
1 1 1

输出样例 #1

0.577 1.000

说明

[JSOI]

题意简述

对给定的 $x{1..n}$, $y{1..n}$, $w_{1..n}$, 求

$$ f(x,y)=\sum_iw_i\sqrt{(x-x_i)^2+(y-y_i)^2} $$

的极值点 $(x,y)$

解题思路

不难发现其 Hasse 矩阵是恒正定的, 也就是说其有且仅有一个极值点

故直接三分即可

不明白为啥一堆人非要模拟退火

代码参考

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb cpa_cpp title:Luogu_P1337 Luogu/P1337/0.cpp %} </details>