「CTSC2004」最优切割
题目大意#
给定一个平面直角坐标系上的木模板和一个目标零件(均为凸多边形),保证零件位于模板内部,且任意不相邻的两边延长线的交点在模板外。
你要进行若干次操作,每次沿着零件的一条边将模板切割成两部分,且只保留含有零件的一部分。
定义加工零件的费用为切割的总长度,求最小花费。
题解#
首先,我们将零件各边所在直线画出来
不难发现,除共线情况以外,零件上的长度最终都是一定要计算的,因此我们放到最后加上去。
那么就只需考虑零件上每个顶点延伸出来的两条线段。
由于每一刀必定切完,因此每个顶点的两条延长线必定且只能选择一条进行累计(因为另一条被切掉了)。
此时可以考虑贪心,优先选择每一个角上较短的那一条切开。但是这样做是有问题的,因为每一刀不一定切到底了。
我们可以尝试分析一下什么情况会导致没有切到底:
-
如果有两条选择的线段恰好与该边共线
稍微手玩一下不难发现,只要我们切下了第一刀,之后都能保证选择较短的那一条线段。
原因是每一对“短线段”都会把原本的环/链断开,最终 零件上每一段连续的顶点 的 较短延长线 要么均为顺时针,要么均为逆时针。
此时按照排列方向切开即可(如上图)。
-
如果没有”短线段对“,则代表短线段均为逆/顺时针排布,此时必须选择一个顶点,将其短线段换成长线段。选择两者差最小的顶点即可。
至此,我们得到了一个贪心算法:
- 求出零件上每个顶点的延长线到模板边界的距离(注意特判共线)
- 选择合适的边切第一刀
- 将余下的短边累加起来
- 将零件边界的长度补上(注意特判共线)
代码略。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现