news 2026/5/15 21:15:12

UVa 1420 Priest John‘s Busiest Day

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 1420 Priest John‘s Busiest Day

题目描述

John\texttt{John}John是小镇上唯一的牧师。每年的101010262626日是他最忙碌的一天,因为传说在这一天结婚的夫妇会受到爱神的祝福。今年有NNN对夫妇计划在这一天举行婚礼,第iii对夫妇的婚礼计划在时间SiS_iSiTiT_iTi进行。

根据传统,每场婚礼都必须有一个特殊仪式,夫妇需要站在牧师面前接受祝福。这个仪式必须满足以下条件:

  1. 仪式必须连续进行,不能中断。
  2. 仪式的持续时间必须超过婚礼总时长的一半。
  3. John\texttt{John}John只能在整数时间点开始或离开仪式。
  4. John\texttt{John}John不能同时主持两个仪式,但可以在一个仪式结束后立即开始下一个。

请你判断John\texttt{John}John是否能够安排出时间,主持所有NNN场婚礼的特殊仪式。

输入格式

  • 输入包含多个测试用例,以一行一个000结束。
  • 每个测试用例的第一行是一个整数NNN1≤N≤100,0001 \le N \le 100,0001N100,000),表示婚礼的数量。
  • 接下来NNN行,每行包含两个整数SiS_iSiTiT_iTi0≤Si<Ti≤21474836470 \le S_i < T_i \le 21474836470Si<Ti2147483647),表示第iii场婚礼的开始和结束时间。

输出格式

  • 对于每个测试用例,如果John\texttt{John}John可以主持所有仪式,输出YES,否则输出NO

样例输入

3 1 5 2 4 3 6 2 1 5 4 6 0

样例输出

NO YES

题目分析

本题的核心是区间安排问题,但与传统活动安排不同的是,每场婚礼的仪式长度不是固定的,而是根据婚礼的时长动态计算得到。

1. 仪式长度的计算

对于一场婚礼[Si,Ti][S_i, T_i][Si,Ti],其总时长为Ti−SiT_i - S_iTiSi
仪式必须超过时长的一半,即:

仪式时长>Ti−Si2 \text{仪式时长} > \frac{T_i - S_i}{2}仪式时长>2TiSi

因为仪式必须在整数时间点开始和结束,所以我们可以将上述条件转化为最短仪式时长

leni=⌊Ti−Si2⌋+1 \texttt{len}_i = \left\lfloor \frac{T_i - S_i}{2} \right\rfloor + 1leni=2TiSi+1

这里⌊⋅⌋\lfloor \cdot \rfloor表示向下取整。加111是为了确保严格大于一半。

2. 仪式可行的开始时间区间

仪式长度为leni\texttt{len}_ileni,必须在[Si,Ti][S_i, T_i][Si,Ti]内连续进行。
设仪式开始时间为ttt,则必须满足:

Si≤t且t+leni≤Ti S_i \le t \quad \text{且} \quad t + \texttt{len}_i \le T_iSitt+leniTi

t+leni≤Tit + \texttt{len}_i \le T_it+leniTi可得:

t≤Ti−leni t \le T_i - \text{len}_itTileni

因此,仪式开始时间ttt必须落在区间:

[Si, Ti−leni] [S_i, \; T_i - \text{len}_i][Si,Tileni]

我们称Li=SiL_i = S_iLi=Si最早开始时间Ri=Ti−leniR_i = T_i - \texttt{len}_iRi=Tileni最晚开始时间

3. 问题转化

现在问题转化为:
NNN个活动,每个活动需要连续进行leni\texttt{len}_ileni单位时间,且必须开始于[Li,Ri][L_i, R_i][Li,Ri]区间内。
问是否存在一种安排顺序,使得所有活动不重叠。

这是一个带时间窗的活动安排问题,可以用贪心算法解决。


解题思路

贪心策略

我们按照最晚开始时间RiR_iRi升序排序。理由如下:

  • 如果某个活动的RiR_iRi很早,说明它必须尽早开始,否则就来不及了。
  • 贪心安排时,我们总是尽量早地开始每个活动,以便为后面的活动留出更多时间。

安排步骤

  1. 排序:将所有婚礼按照RiR_iRi(最晚开始时间)从小到大排序。
  2. 初始化当前时间:设currentTime = 0,表示 John 当前可用的最早开始时间。
  3. 依次安排
    • 对于每个婚礼iii,计算其实际开始时间:
      startTime=max⁡(currentTime, Li) \texttt{startTime} = \max(\texttt{currentTime}, \; L_i)startTime=max(currentTime,Li)
      即不能早于LiL_iLi,也不能早于当前可用时间。
    • 检查是否可行:如果startTime>Ri\texttt{startTime} > R_istartTime>Ri,说明无法在允许的时间窗内开始,直接返回NO
    • 更新当前时间:currentTime = startTime + len_i
  4. 如果所有婚礼都安排成功,输出YES

正确性证明

  • RiR_iRi排序后,如果某个婚礼无法安排,那么无论如何调整顺序,它都无法被安排(因为它的时间窗已经是最宽松的“最晚开始时间”)。
  • 贪心选择最早可能的开始时间,不会使后续安排变差,因为给后面的活动留出了更多的空闲时间。

时间复杂度

  • 排序:O(Nlog⁡N)O(N \log N)O(NlogN)
  • 贪心安排:O(N)O(N)O(N)
    总复杂度O(Nlog⁡N)O(N \log N)O(NlogN),在N≤100,000N \le 100,000N100,000时可行。

代码实现

// Priest John's Busiest Day// UVa ID: 1420// Verdict: Accepted// Submission Date: 2025-12-17// UVa Run Time: 0.060s//// 版权所有(C)2025,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;structWedding{longlongstart,endLimit,len;};boolcompare(constWedding&a,constWedding&b){returna.endLimit<b.endLimit;}intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn;while(cin>>n&&n!=0){vector<Wedding>weddings(n);for(inti=0;i<n;++i){longlongs,t;cin>>s>>t;longlonglen=(t-s)/2+1;// 最短仪式时长weddings[i].start=s;weddings[i].endLimit=t-len;// 最晚开始时间weddings[i].len=len;}sort(weddings.begin(),weddings.end(),compare);longlongcurrentTime=0;boolpossible=true;for(constauto&w:weddings){longlongstartTime=max(currentTime,w.start);if(startTime>w.endLimit){possible=false;break;}currentTime=startTime+w.len;}cout<<(possible?"YES":"NO")<<"\n";}return0;}

总结

本题的关键在于将原问题转化为带时间窗的连续活动安排问题,并通过计算得到每个活动的最短长度和最晚开始时间。贪心策略(按最晚开始时间排序,并尽量早开始)能够高效地判断是否存在可行安排。

这种方法不仅思路清晰,而且代码简洁,时间复杂度为O(Nlog⁡N)O(N \log N)O(NlogN),适合处理大规模输入。

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

WordPress支持跨平台ppt图片压缩转存

要求&#xff1a;开源&#xff0c;免费&#xff0c;技术支持 博客&#xff1a;WordPress 开发语言&#xff1a;PHP 数据库&#xff1a;MySQL 功能&#xff1a;导入Word,导入Excel,导入PPT(PowerPoint),导入PDF,复制粘贴word,导入微信公众号内容,web截屏 平台&#xff1a;Window…

作者头像 李华
网站建设 2026/5/11 0:54:51

2、Linksys WRT54G路由器:开源固件历史、硬件特性与版本差异

Linksys WRT54G路由器:开源固件历史、硬件特性与版本差异 在网络设备的世界里,Linksys WRT54G系列路由器以其可定制性和开源特性受到众多爱好者的青睐。下面我们将深入了解其开源固件的历史、硬件特性以及不同版本之间的差异。 1. WRT54G开源固件的历史 2003年初,Andrew …

作者头像 李华
网站建设 2026/5/11 20:59:53

5、Linksys WRT54G路由器第三方固件全解析

Linksys WRT54G路由器第三方固件全解析 在网络设备的使用中,路由器固件的选择至关重要。对于Linksys WRT54G系列路由器,有多种第三方固件可供选择,每种固件都有其独特的特点和适用场景。下面将详细介绍几种常见的第三方固件。 Linksys原始固件 背景 :该固件是整个WRT54…

作者头像 李华
网站建设 2026/5/13 18:35:41

Qt地图集成实战:高德插件让开发效率提升300%

还在为Qt应用添加地图功能而烦恼吗&#xff1f;传统方案要么依赖笨重的浏览器内核&#xff0c;要么开发周期长、维护困难。今天&#xff0c;我将分享如何通过高德地图Qt插件&#xff0c;在3分钟内完成专业级地图集成&#xff0c;让开发效率实现质的飞跃。 【免费下载链接】amap…

作者头像 李华
网站建设 2026/5/10 1:40:43

ExoPlayer实时流性能测试:从入门到精通的完整指南

ExoPlayer实时流性能测试&#xff1a;从入门到精通的完整指南 【免费下载链接】ExoPlayer 项目地址: https://gitcode.com/gh_mirrors/ex/ExoPlayer ExoPlayer作为Android平台上领先的媒体播放解决方案&#xff0c;在实时流媒体场景中展现出色的性能表现。本指南将深入…

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

Android权限框架深度解析:XXPermissions的技术架构与实现原理

Android权限框架深度解析&#xff1a;XXPermissions的技术架构与实现原理 【免费下载链接】XXPermissions Android 权限请求框架&#xff0c;已适配 Android 14 项目地址: https://gitcode.com/GitHub_Trending/xx/XXPermissions 在Android应用开发中&#xff0c;权限管…

作者头像 李华