题目大意
给定一个平面直角坐标系上的木模板和一个目标零件(均为凸多边形),保证零件位于模板内部,且任意不相邻的两边延长线的交点在模板外。
你要进行若干次操作,每次沿着零件的一条边将模板切割成两部分,且只保留含有零件的一部分。
定义加工零件的费用为切割的总长度,求最小花费。
题解
首先,我们将零件各边所在直线画出来
不难发现,除共线情况以外,零件上的长度最终都是一定要计算的,因此我们放到最后加上去。
那么就只需考虑零件上每个顶点延伸出来的两条线段。
由于每一刀必定切完,因此每个顶点的两条延长线必定且只能选择一条进行累计(因为另一条被切掉了)。
此时可以考虑贪心,优先选择每一个角上较短的那一条切开。但是这样做是有问题的,因为每一刀不一定切到底了。
我们可以尝试分析一下什么情况会导致没有切到底:
-
如果有两条选择的线段恰好与该边共线
稍微手玩一下不难发现,只要我们切下了第一刀,之后都能保证选择较短的那一条线段。
原因是每一对“短线段”都会把原本的环/链断开,最终 零件上每一段连续的顶点 的 较短延长线 要么均为顺时针,要么均为逆时针。
此时按照排列方向切开即可(如上图)。
-
如果没有”短线段对“,则代表短线段均为逆/顺时针排布,此时必须选择一个顶点,将其短线段换成长线段。选择两者差最小的顶点即可。
至此,我们得到了一个贪心算法:
- 求出零件上每个顶点的延长线到模板边界的距离(注意特判共线)
- 选择合适的边切第一刀
- 将余下的短边累加起来
- 将零件边界的长度补上(注意特判共线)
代码略。
标签:切割,线段,延长线,共线,零件,顶点,CTSC2004,最优,模板 From: https://www.cnblogs.com/Lewis-Li/p/bzoj1160.html