当前位置: 首页 > news >正文

UVa 12018 Juice Extractor

问题描述

Jerry \texttt{Jerry}Jerry在玩水果忍者游戏,他有一个特殊能力:可以在任意时刻切割屏幕上所有的水果。每次切割时,如果切割的水果数量超过2 22个,他就能获得等同于切割水果数量的分数。每个水果有出现时间X i X_iXi和消失时间Y i Y_iYiJerry \texttt{Jerry}Jerry只能在[ X i , Y i ] [X_i, Y_i][Xi,Yi]时间段内切割该水果。每个水果被切割后就会消失,不能再被切割。给定N NN个水果的时间区间,求Jerry \texttt{Jerry}Jerry能获得的最大分数。

数据范围:1 ≤ N ≤ 1000 1 \leq N \leq 10001N10000 ≤ X i ≤ Y i ≤ 1 0 9 0 \leq X_i \leq Y_i \leq 10^90XiYi109

解题思路

关键观察

  1. 切割决策点:由于Jerry \texttt{Jerry}Jerry切割时会切掉屏幕上所有水果,我们需要选择一些时间点进行切割。一个重要的优化是:存在一个最优解,其中所有切割时间点都是某个水果的出现时间

  2. 排序与连续性:将水果按出现时间排序后,如果我们在某个时间点t tt切割,那么被切割的水果在排序后的数组中一定是连续的一段

正确性证明

引理 1 :切割时间点可以限定为水果的出现时间

证明:假设在最优解中存在一个切割时间t tt,它不是一个水果的出现时间。设这次切割覆盖的水果集合为S SS。令t ′ = max ⁡ { X i ∣ i ∈ S } t' = \max\{X_i \mid i \in S\}t=max{XiiS},即S SS中水果最晚的出现时间。由于所有i ∈ S i \in SiS都满足X i ≤ t ≤ Y i X_i \leq t \leq Y_iXitYi,且t ′ ≤ t t' \leq ttt,所以对于任意i ∈ S i \in SiS,仍有X i ≤ t ′ ≤ Y i X_i \leq t' \leq Y_iXitYi。因此,将切割时间从t tt提前到t ′ t't不会减少被切割的水果数量,且t ′ t't是某个水果的出现时间。由此,所有切割时间都可以调整为水果的出现时间。

引理 2 :被切割的水果在排序后连续

证明:将水果按出现时间升序排序,设排序后的数组为a 1 , a 2 , … , a n a_1, a_2, \ldots, a_na1,a2,,an。假设在时间t tt切割,且t tt是某个水果a k a_kak的出现时间。设被切割的水果集合为S SS。对于任意i , j ∈ S i, j \in Si,jSi < j i < ji<j,假设存在m mm满足i < m < j i < m < ji<m<jm ∉ S m \notin Sm/S。由于a m a_mam的出现时间X m ≤ X j ≤ t X_m \leq X_j \leq tXmXjt(因为排序后X m ≤ X j X_m \leq X_jXmXj),且a m a_mam没有被切割,说明Y m < t Y_m < tYm<t。但a i a_iai被切割意味着Y i ≥ t Y_i \geq tYit,而X m ≤ X j ≤ t X_m \leq X_j \leq tXmXjtY m < t Y_m < tYm<t,与排序性质矛盾。因此,S SS在排序数组中必须是连续的一段。

动态规划设计

基于以上观察,我们设计动态规划算法:

  • 状态定义:令d p [ i ] dp[i]dp[i]表示考虑前i + 1 i+1i+1个水果(下标从0 00开始)时能获得的最大分数。
  • 状态转移
    1. 不切割第i ii个水果的出现时间:d p [ i ] = d p [ i − 1 ] dp[i] = dp[i-1]dp[i]=dp[i1]
    2. 以第i ii个水果的出现时间t = X i t = X_it=Xi进行切割:从i ii往前遍历,统计在时间t tt仍然存在(即Y j ≥ t Y_j \geq tYjt)的水果数量c n t cntcnt。如果c n t > 2 cnt > 2cnt>2,则可以从d p [ j − 1 ] dp[j-1]dp[j1]转移,其中j jj是这组连续水果的起始下标:d p [ i ] = max ⁡ ( d p [ i ] , d p [ j − 1 ] + c n t ) dp[i] = \max(dp[i], dp[j-1] + cnt)dp[i]=max(dp[i],dp[j1]+cnt)
  • 边界条件d p [ − 1 ] = 0 dp[-1] = 0dp[1]=0(没有水果时分数为0 00)。
  • 最终答案d p [ n − 1 ] dp[n-1]dp[n1]

复杂度分析

  • 时间复杂度:O ( N 2 ) O(N^2)O(N2),对于每个水果i ii,需要向前遍历统计可切割的水果数量。N ≤ 1000 N \leq 1000N1000,因此总计算量在可接受范围内。
  • 空间复杂度:O ( N ) O(N)O(N),用于存储d p dpdp数组和水果数据。

代码实现

// Juice Extractor// UVa ID: 12018// Verdict: Accepted// Submission Date: 2025-12-20// UVa Run Time: 0.000s//// 版权所有(C)2025,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;constintMAXN=1010;structFruit{intstart,end;}fruits[MAXN];intdp[MAXN],n;intdfs(intp){if(p==-1)return0;if(~dp[p])returndp[p];// 第 p 个水果的出现时间不切割intr=dfs(p-1);// 第 p 个水果的出现时间作为切割时间intcnt=0;for(inti=p;i>=0;i--){if(fruits[i].end>=fruits[p].start)cnt++;if((!i||fruits[i-1].start!=fruits[i].start)&&cnt>2)r=max(r,dfs(i-1)+cnt);}returndp[p]=r;}intmain(){intt;cin>>t;for(intcaseId=1;caseId<=t;++caseId){cin>>n;for(inti=0;i<n;i++)cin>>fruits[i].start>>fruits[i].end;sort(fruits,fruits+n,[](constFruit&a,constFruit&b){if(a.start!=b.start)returna.start<b.start;returna.end<b.end;});memset(dp,-1,sizeofdp);cout<<"Case #"<<caseId<<": "<<dfs(n-1)<<'\n';}return0;}

代码说明

  1. 排序:将水果按出现时间升序排序,如果出现时间相同则按消失时间升序排序。
  2. 记忆化搜索:函数dfs(p)计算前p + 1 p+1p+1个水果的最大分数,使用d p dpdp数组记忆化结果。
  3. 转移细节:在统计可切割水果数量时,通过条件fruits[i - 1].start != fruits[i].start确保只在连续相同开始时间的最后一个水果处进行转移,避免重复计算。
  4. 输出:按照题目要求输出每个测试用例的结果。

总结

本题的关键在于将切割时间点优化为水果的出现时间,并利用排序后的连续性简化动态规划转移。通过O ( N 2 ) O(N^2)O(N2)的动态规划,可以在规定时间内求解N ≤ 1000 N \leq 1000N1000的问题。代码实现简洁,记忆化搜索使状态转移更加直观。

http://www.jsqmd.com/news/115619/

相关文章:

  • JSP标签JSTL标签EL表达式
  • 大数据工程师必看:批处理性能优化的10个黄金法则
  • ProcessExplorer_17.09_x64-Chs 新版本升级:我看到的区别与优势(含升级思路与注意点)
  • SpringBoot勤工助学信息管理高效的平台|1125(领完整源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、全套文案
  • COMSOL激光超声仿真:激光激发超声波的产生瑞利波的数值模拟 版本为6.1,低于此版本打不开此模型
  • AI Agent在企业数字化转型中的关键角色与实施策略
  • 从零到飞:四旋翼无人机智能控制与路径规划全解析
  • 3Arduino IDE 安装
  • AI Agent架构师必备:30个核心术语速成指南
  • 水凝膜、电镀钢化膜和UV光固膜哪个更防指纹,哪个透光更高呢?排序一下?
  • 【节点】[LinearToGammaSpaceExact节点]原理解析与实际应用
  • 2Arduino 板型号
  • 大模型岗位全解析:从预训练到应用开发,5大梯队深度指南+2026转型攻略
  • 【硕士论文完美复现】【价格型需求响应】基于需求侧响应的配电网供电能力综合评估(Python代码实现) - 指南
  • 8款AI论文辅助工具全面评测:改写与原创写作能力分析
  • 详细介绍:测试用例的八大核心要素
  • 线性筛素数 - Rye
  • 从“软件3.0”到“深度求索”:我们这代程序员,正站在一个怎样的路口?
  • 提示词工程精华总结:掌握ICIO框架与五大核心要素,AI应用效率翻倍,建议收藏!
  • 提示词工程精华总结:掌握ICIO框架与五大核心要素,AI应用效率翻倍,建议收藏!
  • 网络传输原理(TCP/IP)
  • 大模型应用开发避坑指南:从Demo到实战的6大性能陷阱与解决方案
  • CSS animation-timeline动画时间线 - 详解
  • 广州新加坡留学机构 TOP5 评测!大湾区优质教育培训机构榜单发布,助力学子规划海外升学之路 - 全局中转站
  • Aspire 与 Azure Functions 深度集成:架构范式、工程实践与运维
  • AI大模型引发的产业变革:把握智能时代机遇的全面指南
  • 广州英国留学机构TOP5评测!大湾区优质升学机构榜单发布,助力学子规划海外升学之路 - 全局中转站
  • 杭州到大连、沈阳、鄂尔多斯、包头、呼和浩特、长春、哈尔滨、大庆搬家公司搬家物流省心推荐!跨省搬家费用明细 - 物流人
  • Collections.unmodifiableSet()
  • 杭州到武汉、郑州、济南、长沙、西安、南宁、乌鲁木齐搬家公司物流排行榜!搬家费用明细! - 物流人