如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1058

来自"NOCOW"

跳转到: 导航, 搜索
 这篇文章可以证实是由NOCOW用户原创,不存在任何版权争议。
 本文作者同意以GNU FDLCC-by-saGNU LGPL(如果适用)三种版权发布此文章(不包括翻译文章中属于原始所有者的部分版权)。
 如果你修改了这篇文章并且不同意用GNU FDL以外的版权发布,可以换一个版权模板或者移除此模板。
这是URAL Volume 1 中的OI题目Chocolate介绍及题解,参见 翻译C语言代码C++语言代码Pascal语言代码

目录

[编辑] 题目叙述

有一个凸N边形,3<=n<=50,顶点的坐标范围为-100到100的实数,求最短的割痕使得分成的两部分面积相等。

[编辑] 算法复杂度

时间复杂度 O(n2)

空间复杂度 O(n)

[编辑] 算法叙述

以下用S表示此多边形的总面积,S(A)表示A部分的面积,\overline {p q}表示p到q的直线距离。

可以看到,最优解一定在以下两种情况中:(蓝色直线为切痕)

Image:Ural1058.png

在a)中,枚举经过的顶点(图中的P点),然后顺着多边形走,肯定会找到某条边(图中的绿色边),使得S(A)和S(B)都小于0.5*S,则: {S(1) \over S(2)}={0.5S-S(A) \over 0.5S-S(B)}

根据S(1)和S(2)的比(和三角形面积公式)就可以算出切痕和多边形的另一个交点,从而得到切痕长。

下面重点说明b)这种情况。首先,可以证明(在后面),∠1=∠2。所以算法分为以下几步:

  1. 找到PQ的斜率,设为k。这个我是先计算两条绿边的倾斜角,再取平均数,再取正切值得到的。注意:区分内角平分线和外角平分线!
  2. 过这两条边的四个端点作四条斜率为k的直线,选其中两条(与两条绿边交于两点的),即图中红色的线,如果不存在这样的线,则说明此情况无解。设依次交于a,b,c,d四点(如图)。
  3. 计算S(A)和S(B),注意不要丢掉“多余的一小条”。同上,可以得出S(1)和S(2)。
    • 当S(2)=0时,P,Q分别与b,c重合,\overline {P Q}=\overline {b c}
    • S(2) \ne 0时,令U= \begin{matrix} \frac{S(1)}{S(2)} \end{matrix},根据梯形面积公式,切痕长度\overline {P Q}=\sqrt{\frac {{\overline {a d}}^2+U{\overline {b c}}^2} {1+U}}

在所有的PQ中找到最小值即可。

[编辑] 补充证明

b)中∠1=∠2的证明:即证明以下命题:

Image:Ural1058b.png

已知∠OAB=α,OP平分∠OAB交AB于P,OP⊥AB(∴∠OAB=∠OBA),CD交AB于H,S_{\triangle ACH}=S_{\triangle BDH},求证:CD \ge AB

证明: 作CM⊥OP于M,DN⊥OP于N,CD交OP于K,

\triangle OCM \sim \triangle OAP\triangle ODN \sim \triangle OBP\triangle CMK \sim \triangle DNK

又∵S_{\triangle AOB}=OA \times OB \times \sin \alphaS_{\triangle COD}=OC \times OD \times \sin \alphaS_{\triangle AOB}=S_{\triangle COD}

OA \times OB=OC \times OD

CM= \frac{OC \times AP} {OA} ,\qquad DN= \frac{OD \times BP} {OB} =\frac{OD \times AP} {OB}

CM \times DN =\frac{OC \times OD \times AP^2} {OA \times OB} =\frac{OA \times OB \times AP^2} {OA \times OB}=AP^2

根据均值不等式,有CM+DN \ge 2AP=AB

CK \ge CM \quad , \quad DK \ge DN

CD=CK+CK \ge CM+DN \ge AB


命题得证。

个人工具