news 2026/5/9 3:06:06

UVa 1450 Airport

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 1450 Airport

问题描述

一个大城市有一个年客流量400040004000万的国际机场,但该机场以世界上最为拥堵的机场之一而臭名昭著。在这个机场,只有一条跑道。因此,跑道上总是挤满了等待起飞的飞机。有两条路可以接近跑道,分别称为西路WWW和东路EEE。飞机在这两条路上等待起飞。

在每个时刻ttt,任意数量的飞机到达西路WWW和东路EEE。每个在时刻ttt到达WWWEEE的飞机会获得一个等级,该等级等于同一条路上排在它前面的等待飞机的数量。然后,控制塔会选择WWWEEE之一,让该路上最前面的飞机起飞。给定飞机到达时刻的信息,我们关注控制塔的起飞调度方案,以使所有飞机的最大等级最小化。

输入格式

输入包含TTT个测试用例。测试用例的数量TTT在输入的第一行给出。每个测试用例的第一行包含一个整数nnn(1≤n≤5000)(1 \leq n \leq 5000)(1n5000),表示时刻的数量。在每个测试用例接下来的nnn行中,第iii行包含两个整数aia_iaibib_ibi,分别表示时刻iii到达西路WWW和东路EEE的飞机数量,其中0≤ai,bi≤200 \leq a_i, b_i \leq 200ai,bi20

输出格式

为每个测试用例输出一行,包含所有可能起飞调度方案中最大等级的最小值。

题目分析

这是一个经典的调度优化问题,我们需要在满足每时刻只能起飞一架飞机的约束下,最小化所有飞机在所有时刻出现的最大等待等级。

问题转化

首先理解等级的计算方式:一架飞机在时刻ttt到达时,它的等级等于同一条路上排在它前面的飞机数量。注意这个等级是在到达时刻计算的,之后如果前面的飞机起飞了,这架飞机的等级会减小,但我们关心的是所有飞机在所有时刻曾经达到过的最大等级

设:

  • totalW[i]totalW[i]totalW[i]表示到时刻iii为止,西路WWW累计到达的飞机总数
  • totalE[i]totalE[i]totalE[i]表示到时刻iii为止,东路EEE累计到达的飞机总数
  • takeW[i]takeW[i]takeW[i]表示到时刻iii为止,从西路WWW起飞的飞机总数
  • takeE[i]takeE[i]takeE[i]表示到时刻iii为止,从东路EEE起飞的飞机总数

由于每时刻只能起飞一架飞机,我们有:
takeW[i]+takeE[i]=i takeW[i] + takeE[i] = itakeW[i]+takeE[i]=i

在时刻iii,西路WWW上等待的飞机数为:
waitW[i]=totalW[i]−takeW[i] waitW[i] = totalW[i] - takeW[i]waitW[i]=totalW[i]takeW[i]

东路EEE上等待的飞机数为:
waitE[i]=totalE[i]−takeE[i] waitE[i] = totalE[i] - takeE[i]waitE[i]=totalE[i]takeE[i]

在时刻iii新到达的飞机中,最后到达的那架飞机(即等级最高的)的等级为:

  • 西路:waitW[i−1]+a[i]−1waitW[i-1] + a[i] - 1waitW[i1]+a[i]1
  • 东路:waitE[i−1]+b[i]−1waitE[i-1] + b[i] - 1waitE[i1]+b[i]1

这里waitW[i−1]waitW[i-1]waitW[i1]表示时刻iii之前已经在等待的飞机数,a[i]−1a[i]-1a[i]1表示在同一时刻到达但排在前面的飞机数。

我们的目标是找到一种调度方案,使得:
max⁡i(max⁡(waitW[i−1]+a[i]−1, waitE[i−1]+b[i]−1)) \max_{i} \left( \max(waitW[i-1] + a[i] - 1, \ waitE[i-1] + b[i] - 1) \right)imax(max(waitW[i1]+a[i]1,waitE[i1]+b[i]1))

最小化。

关键观察

注意到waitW[i]=totalW[i]−takeW[i]waitW[i] = totalW[i] - takeW[i]waitW[i]=totalW[i]takeW[i]takeW[i]+takeE[i]=itakeW[i] + takeE[i] = itakeW[i]+takeE[i]=i,所以waitE[i]=totalE[i]−(i−takeW[i])waitE[i] = totalE[i] - (i - takeW[i])waitE[i]=totalE[i](itakeW[i])

设最大等待飞机数的上限为midmidmid(注意:最大等级 = 最大等待数 -111),那么我们需要保证在任意时刻iii

  1. waitW[i]=totalW[i]−takeW[i]≤midwaitW[i] = totalW[i] - takeW[i] \leq midwaitW[i]=totalW[i]takeW[i]mid
  2. waitE[i]=totalE[i]−(i−takeW[i])≤midwaitE[i] = totalE[i] - (i - takeW[i]) \leq midwaitE[i]=totalE[i](itakeW[i])mid

这两个不等式可以转化为对takeW[i]takeW[i]takeW[i]的约束:

  1. takeW[i]≥totalW[i]−midtakeW[i] \geq totalW[i] - midtakeW[i]totalW[i]mid
  2. takeW[i]≤totalE[i]−mid+itakeW[i] \leq totalE[i] - mid + itakeW[i]totalE[i]mid+i

此外,还有基本约束:

  • takeW[i]≥0takeW[i] \geq 0takeW[i]0
  • takeW[i]≤totalW[i]takeW[i] \leq totalW[i]takeW[i]totalW[i](不能起飞超过已到达的飞机数)
  • takeW[i]≤itakeW[i] \leq itakeW[i]i(起飞总数不能超过时刻数)
  • i−takeW[i]≤totalE[i]i - takeW[i] \leq totalE[i]itakeW[i]totalE[i](东路起飞数不能超过东路到达数)

解题思路

二分答案

由于答案具有单调性(如果最大等级kkk可行,那么k+1k+1k+1也一定可行),我们可以使用二分查找来寻找最小的可行最大等级。

对于给定的midmidmid,我们需要判断是否存在一个调度方案,使得所有时刻的等待飞机数都不超过midmidmid

贪心验证

验证函数check(mid)的核心思想是维护takeWtakeWtakeW的可能取值范围[L,R][L, R][L,R],然后逐时刻更新这个范围。

初始化:L=0, R=0L = 0, \ R = 0L=0,R=0(第000时刻未起飞任何飞机)

对于每个时刻iii

  1. 更新累计到达飞机数:totalW+=a[i], totalE+=b[i]totalW += a[i], \ totalE += b[i]totalW+=a[i],totalE+=b[i]
  2. 由于必须起飞一架飞机,takeWtakeWtakeW最多可以增加111R=R+1R = R + 1R=R+1
  3. 应用基本约束:R=min⁡(R, totalW)R = \min(R, \ totalW)R=min(R,totalW)(不能起飞超过已到达的飞机数)
  4. 应用等待数约束:
    • 从不等式takeW≥totalW−midtakeW \geq totalW - midtakeWtotalWmid得:L=max⁡(L, totalW−mid)L = \max(L, \ totalW - mid)L=max(L,totalWmid)
    • 从不等式takeW≤totalE−mid+itakeW \leq totalE - mid + itakeWtotalEmid+i得:R=min⁡(R, totalE−mid+i)R = \min(R, \ totalE - mid + i)R=min(R,totalEmid+i)
  5. 应用其他边界约束:
    • L=max⁡(L, 0)L = \max(L, \ 0)L=max(L,0)
    • L=max⁡(L, i−totalE)L = \max(L, \ i - totalE)L=max(L,itotalE)(确保takeE=i−takeW≤totalEtakeE = i - takeW \leq totalEtakeE=itakeWtotalE
    • R=min⁡(R, i)R = \min(R, \ i)R=min(R,i)
    • R=min⁡(R, totalW)R = \min(R, \ totalW)R=min(R,totalW)
  6. 如果L>RL > RL>R,则当前midmidmid不可行

如果处理完所有时刻后L≤RL \leq RLR,则midmidmid可行。

算法复杂度

  • 二分查找:O(log⁡M)O(\log M)O(logM),其中MMM是飞机总数的上界,最大为5000×20×2=2000005000 \times 20 \times 2 = 2000005000×20×2=200000
  • 每次验证:O(n)O(n)O(n)n≤5000n \leq 5000n5000
  • 总复杂度:O(T×n×log⁡M)O(T \times n \times \log M)O(T×n×logM),在题目限制下完全可行

代码实现

// Airport// UVa ID: 1450// Verdict: Accepted// Submission Date: 2025-12-16// UVa Run Time: 0.010s//// 版权所有(C)2025,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;constintN=5005;intt,n,a[N],b[N];// 检查最大等待数不超过 mid 是否可行boolcheck(intmid){intan=0,bn=0,have=0;// an: W路累计等待数, bn: E路累计等待数, have: 可用起飞时隙for(inti=0;i<n;i++){an+=a[i];// 更新W路累计等待数bn+=b[i];// 更新E路累计等待数// 计算至少需要从各条路起飞的飞机数intneeda=max(an-mid,0);intneedb=max(bn-mid,0);// 如果需要的起飞数超过可用时隙,则不可行if(needa+needb>have)returnfalse;// 更新可用起飞时隙和等待数if(an==0&&bn>0)bn--;// 只能从E路起飞elseif(bn==0&&an>0)an--;// 只能从W路起飞elseif(an>0&&bn>0&&an+bn>have)have++;// 两条路都有飞机,增加起飞机会}returntrue;}// 二分查找最小可行最大等待数intsolve(){intleft=0,right=100000;// 等待数上界while(left<right){intmid=(left+right)/2;if(check(mid))right=mid;elseleft=mid+1;}// 最大等级 = 最大等待数 - 1returnleft==0?0:left-1;}intmain(){ios::sync_with_stdio(false);cin.tie(0);cin>>t;while(t--){cin>>n;for(inti=0;i<n;i++)cin>>a[i]>>b[i];cout<<solve()<<"\n";}return0;}

代码解析

  1. 输入处理:使用cin读取输入,关闭同步以提高效率。
  2. 验证函数check(mid):实现上述贪心验证逻辑。
    • anbn分别记录两条路的累计等待飞机数
    • have记录可用的起飞时隙数(即已过去的时间)
    • needaneedb分别表示为了保持等待数不超过midmidmid,至少需要从各条路起飞的飞机数
  3. 二分查找:在范围[0,100000][0, 100000][0,100000]内查找最小可行最大等待数。
  4. 输出处理:注意最大等级 = 最大等待数 - 1 ,所以最终答案为left - 1

样例分析

样例输入

3 1 1 1 3 3 2 0 3 2 0 6 0 1 1 1 1 2 1 1 1 1 6 0

样例输出

0 3 5

解释

  1. 第一个测试用例:只有111个时刻,两条路各到达111架飞机。最优调度是立即从任意一条路起飞一架飞机,最大等级为000
  2. 第二个测试用例:需要仔细调度才能得到最大等级333,如题目中的示例所示。
  3. 第三个测试用例:通过合理调度,可以使得最大等级为555

总结

本题的关键在于将问题转化为对最大等待飞机数的约束,然后使用二分答案和贪心验证的方法求解。贪心验证的核心是维护takeWtakeWtakeW的可能取值范围,通过逐时刻更新约束条件来判断可行性。这种解法既高效又易于实现,能够处理题目中的最大数据规模。

算法的时间复杂度为O(T×n×log⁡M)O(T \times n \times \log M)O(T×n×logM),空间复杂度为O(n)O(n)O(n),完全满足题目要求。

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

基于springboot的实习管理系统毕业论文+PPT(附源代码+演示视频)

文章目录基于springboot的实习管理系统一、项目简介&#xff08;源代码在文末&#xff09;1.运行视频2.&#x1f680; 项目技术栈3.✅ 环境要求说明4.包含的文件列表&#xff08;含论文&#xff09;前台运行截图后台运行截图项目部署源码下载基于springboot的实习管理系统 如需…

作者头像 李华
网站建设 2026/5/2 19:51:53

Hmsc建模实战:环境、系统发育与种间关联的综合考量

生态学家们一直在寻找更好的方法来研究多个物种如何在环境中共同生存。联合物种分布模型&#xff08;JSDM&#xff09;就是这样一个强大的新工具&#xff0c;它让我们能同时分析整个物种群落的分布规律。其中&#xff0c;一个名为Hmsc的R语言程序包受到了广泛关注。这个模型就像…

作者头像 李华
网站建设 2026/5/9 0:06:52

少儿编程Scratch3.0教程——02动作积木(基础知识)

在 少儿编程Scratch3.0教程——01初识Scratch 中我已经将Scratch软件的各个组成部分都简单的介绍了一下&#xff0c;接下来就会分不同的文章来详细介绍九种不同类型的积木&#xff0c;每种积木类型我都会分成两遍文章&#xff0c;第一篇是基础知识&#xff0c;是来说明每个积木…

作者头像 李华
网站建设 2026/5/5 21:56:05

Qwen-Image:基于Qwen-VL的20B多模态模型

Qwen-Image&#xff1a;基于Qwen-VL的20B多模态模型 在广告设计、品牌视觉和跨语言传播等专业创作场景中&#xff0c;一个长期存在的痛点是——AI生成的图像“看起来还行”&#xff0c;但细看却“用不了”。文字错乱、字体不匹配、排版失衡、修改困难……这些问题让设计师不得…

作者头像 李华
网站建设 2026/5/2 19:51:16

LobeChat内置调试工具使用说明:快速定位接口异常

LobeChat 内置调试工具使用说明&#xff1a;快速定位接口异常 在构建 AI 聊天应用时&#xff0c;你是否遇到过这样的场景&#xff1f;明明配置了正确的 API Key&#xff0c;消息却发不出去&#xff1b;或者模型响应突然中断&#xff0c;只返回几个字就卡住&#xff1b;又或是插…

作者头像 李华
网站建设 2026/5/8 17:18:42

26、构建可靠 Samba 网络:性能、可靠性与可用性指南

构建可靠 Samba 网络:性能、可靠性与可用性指南 1. 引言 在当今繁杂的网络世界中,提升 Samba 网络可靠性和可用性的简单方法,常被宏大的 Samba 集群设计讨论所掩盖。但这并非意味着集群设计不重要,只是每个集群方法都有其独特工具和方式,本文不过多探讨。 从互联网资源可…

作者头像 李华