首页 > 其他分享 >「CTSC2004」最优切割

「CTSC2004」最优切割

时间:2022-10-10 21:34:19浏览次数:87  
标签:切割 线段 延长线 共线 零件 顶点 CTSC2004 最优 模板

题目大意

[CTSC2004]最优切割 - HydroOJ

给定一个平面直角坐标系上的木模板和一个目标零件(均为凸多边形),保证零件位于模板内部,且任意不相邻的两边延长线的交点在模板外。

你要进行若干次操作,每次沿着零件的一条边将模板切割成两部分,且只保留含有零件的一部分。

定义加工零件的费用为切割的总长度,求最小花费。

题解

首先,我们将零件各边所在直线画出来

例子

不难发现,除共线情况以外,零件上的长度最终都是一定要计算的,因此我们放到最后加上去。

那么就只需考虑零件上每个顶点延伸出来的两条线段。

由于每一刀必定切完,因此每个顶点的两条延长线必定且只能选择一条进行累计(因为另一条被切掉了)。

此时可以考虑贪心,优先选择每一个角上较短的那一条切开。但是这样做是有问题的,因为每一刀不一定切到底了。

我们可以尝试分析一下什么情况会导致没有切到底:

  1. 如果有两条选择的线段恰好与该边共线

    三种情况

    稍微手玩一下不难发现,只要我们切下了第一刀,之后都能保证选择较短的那一条线段。

    原因是每一对“短线段”都会把原本的环/链断开,最终 零件上每一段连续的顶点 的 较短延长线 要么均为顺时针,要么均为逆时针。

    此时按照排列方向切开即可(如上图)。

  2. 如果没有”短线段对“,则代表短线段均为逆/顺时针排布,此时必须选择一个顶点,将其短线段换成长线段。选择两者差最小的顶点即可。

    例子

至此,我们得到了一个贪心算法:

  1. 求出零件上每个顶点的延长线到模板边界的距离(注意特判共线)
  2. 选择合适的边切第一刀
  3. 将余下的短边累加起来
  4. 将零件边界的长度补上(注意特判共线)

代码略。

标签:切割,线段,延长线,共线,零件,顶点,CTSC2004,最优,模板
From: https://www.cnblogs.com/Lewis-Li/p/bzoj1160.html

相关文章