当前位置: 首页 > 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.gsyq.cn/news/127565.html

相关文章:

  • AI Agent在企业数字化转型中的关键角色与实施策略
  • 大模型岗位全解析:从预训练到应用开发,5大梯队深度指南+2026转型攻略
  • 【扣子编程】| 2000字实操指南(Coze最新上线)
  • 提示词工程精华总结:掌握ICIO框架与五大核心要素,AI应用效率翻倍,建议收藏!
  • SpringBoot勤工助学信息管理高效的平台|1125(领完整源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、全套文案
  • 网络传输原理(TCP/IP)
  • AWS For Fluent Bit:高效日志收集与传输的Docker镜像
  • Collections.unmodifiableSet()
  • 一文彻底搞懂AI Agent:从概念到两种核心设计模式(图文详解)
  • 杭州到重庆、成都、昆明、贵阳、遵义、绵阳、宜宾、德阳搬家公司物流排行榜!搬家费用明细! - 物流人
  • Visual Studio 2026 开发 MAUI app 记录
  • LDR6500取电方案强势进入XM供应链
  • 影刀RPA实战:3步搞定希音客户行为数据提取,效率飙升[特殊字符]
  • CTF中Web题目的常见题型及解题姿势,零基础入门到精通,收藏这篇就够了
  • 还在手动处理跨境物流?RPA智能处理希音订单,效率暴增30倍![特殊字符]
  • CTF大揭秘:从DEF_CON到全民热潮的极客游戏
  • 北京到武汉、郑州、济南、长沙、西安、南宁、乌鲁木齐、兰州搬家公司专业排行榜!搬家费用明细! - 物流人
  • 北京到大连、沈阳、鄂尔多斯、包头、呼和浩特、长春、哈尔滨、大庆搬家公司可信赖度排行榜!搬家费用明细! - 物流人
  • python手写数字识别系统 CNN卷积神经网络算法 深度学习、pytorch 手写数字识别(建议收藏)✅ - 指南
  • MySQL禁止3表以上JOIN的原因详解
  • 黑盒测试方法:原理、技术与实践演进
  • PySpark实战 - 2.2 利用Spark SQL计算总分与平均分
  • 震惊!这家云服务器代理商竟让企业口碑飙升,背后真相揭秘!
  • 连续时间下的概率预测
  • 第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第一赛季优化题--无人机配送
  • 比特彗星(BitComet) v2.19解锁全功能豪华版
  • 20个渗透CTF练习平台资源(2025)
  • 并发测试中的五大常见陷阱与破解之道
  • CTF学习路线(非常详细)零基础入门到精通,收藏这一篇就够了_ctf 学习路线
  • CTF之——密码破解工具hashcat,零基础入门到精通,看完这篇就足够了~_压缩包密码忘记了,如何使用hashcat