news 2026/5/12 15:59:48

UVa 12018 Juice Extractor

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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的问题。代码实现简洁,记忆化搜索使状态转移更加直观。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 9:37:13

COMSOL激光超声仿真:激光激发超声波的产生瑞利波的数值模拟 版本为6.1,低于此版本打不开此模型

COMSOL激光超声仿真:激光激发超声波的产生瑞利波的数值模拟 版本为6.1&#xff0c;低于此版本打不开此模型 直接进入主题&#xff1a;在COMSOL 6.1里折腾激光超声仿真这事&#xff0c;本质上就是玩转热弹效应——激光脉冲怼材料表面&#xff0c;瞬间热膨胀产生超声波。咱们重点…

作者头像 李华
网站建设 2026/5/11 16:58:04

计算机毕业设计springboot“智享圈”新媒体学习网站 基于SpringBoot的“智享汇”新媒体在线学习社区 SpringBoot驱动的“知媒学堂”互动式新媒体资源平台

计算机毕业设计springboot“智享圈”新媒体学习网站d272d520 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“学习”从教室搬到指尖&#xff0c;知识就拥有了新的流量入口。短…

作者头像 李华
网站建设 2026/5/10 5:48:33

5款AI开源神器收藏必备!从流程图生成到视频推理,轻量级模型到智能代理,一文全掌握

本文介绍了5款AI领域优质开源项目&#xff1a;大模型控制流程图生成工具、轻量级视频生成框架LightX2V、超小型语言模型MiniMind、个人PC大模型启动器Shimmy以及通用AI代理Ailice。这些工具涵盖自然语言绘图、多模态生成、轻量级推理等多种应用场景&#xff0c;均提供完整开源代…

作者头像 李华
网站建设 2026/5/11 4:38:13

AI Agent架构师必备:30个核心术语速成指南

本文整理了AI Agent领域的30个核心术语&#xff0c;涵盖智能体基本概念、工作机制、系统架构及技术实现。这些术语是理解现代AI智能体思考、行动和协作方式的基础知识&#xff0c;对使用LangChain、Spring AI等智能体框架的开发者尤为重要&#xff0c;能帮助理清关键构成模块间…

作者头像 李华
网站建设 2026/5/11 5:37:06

网络传输原理(TCP/IP)

将内存中某个地址的数据通过网口发送出去&#xff0c;本质是数据从用户态内存→内核态内存→网卡硬件→物理链路的传递过程&#xff0c;同时伴随TCP/IP 协议栈的逐层封装和操作系统 / 硬件的资源调度。以下按 ** 软件层&#xff08;应用 内核&#xff09;→硬件层&#xff08;…

作者头像 李华
网站建设 2026/5/9 23:10:49

大模型应用开发:从RAG到Agent的智能问答系统优化之路,解决场景区分不清的难题

文章讲述了智能问答系统从纯RAG技术到结合Agent技术的优化过程。针对三个子场景中结构化和非结构化数据混合查询的问题&#xff0c;作者最初按场景建立三个知识库&#xff0c;但遇到召回率低、场景判断不准的困境。后改为从数据类型维度建立两个知识库&#xff08;结构化和非结…

作者头像 李华