「CTSC2004」最优切割

题目大意#

[CTSC2004]最优切割 - HydroOJ

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

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

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

题解#

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

例子

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

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

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

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

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

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

    三种情况

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

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

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

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

    例子

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

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

代码略。

posted @   LewisLi  阅读(145)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩