尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

UVa 1450 Airport

UVa 1450 Airport
📅 发布时间:2026/6/17 20:42:01

问题描述

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

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

输入格式

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

输出格式

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

题目分析

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

问题转化

首先理解等级的计算方式:一架飞机在时刻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[i−1]+a[i]−1
  • 东路:waitE[i−1]+b[i]−1waitE[i-1] + b[i] - 1waitE[i−1]+b[i]−1

这里waitW[i−1]waitW[i-1]waitW[i−1]表示时刻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[i−1]+a[i]−1,waitE[i−1]+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]−(i−takeW[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]−(i−takeW[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]i−takeW[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最多可以增加111:R=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 - midtakeW≥totalW−mid得:L=max⁡(L, totalW−mid)L = \max(L, \ totalW - mid)L=max(L,totalW−mid)
    • 从不等式takeW≤totalE−mid+itakeW \leq totalE - mid + itakeW≤totalE−mid+i得:R=min⁡(R, totalE−mid+i)R = \min(R, \ totalE - mid + i)R=min(R,totalE−mid+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,i−totalE)(确保takeE=i−takeW≤totalEtakeE = i - takeW \leq totalEtakeE=i−takeW≤totalE)
    • 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 RL≤R,则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 5000n≤5000
  • 总复杂度: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):实现上述贪心验证逻辑。
    • an和bn分别记录两条路的累计等待飞机数
    • have记录可用的起飞时隙数(即已过去的时间)
    • needa和needb分别表示为了保持等待数不超过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),完全满足题目要求。

相关新闻

  • 从算法到载体的闭环:解构未来大算力目标追踪无人机集群软硬一体化供应商 - 品牌2025
  • [ROS实战] 零硬件成本调试户外导航:Python模拟GPS信号 + RViz加载高德地图实现“云”行走
  • 【JavaWeb】乱码问题_HTML_Tomcat日志_sout乱码问题

最新新闻

  • Python 练习题讲解 3 · 字符串
  • 东营换轮胎怎么选?本地市场盘点、轮胎选购避坑+门店筛选完整指南 - 国麟测评
  • Element Plus 组件库 + 美化页面
  • 上海澳洲留学社科类文书中介:精选案例客观评估 - 虚拟星辰
  • 微信支付AI卡,充多少花多少
  • 英雄联盟Akari助手:从青铜到王者的终极游戏效率提升指南

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号