uva live 4725题解



题目大意:机场上有两个跑道,分别为W和E,每个时刻,W和E都分别都分别有飞机进入跑道,每个跑道的飞机都按顺序从0开始排序,每个时刻都允许一架飞机起飞,现要求你安排起飞的飞机,使得任意时刻的飞机的最大编号最小

解题思路:最小最大值问题,二分进行枚举剩余飞机最大数量,即id+1。先统计一下能起飞的总飞机数和W和E两个跑道能起飞的飞机数,如果总的起飞数小于两个跑道的所需起飞数          或               每个跑道的所需起飞数大于该跑道起飞数则不成立

源码如下

#include<cstdio>  
#include<cstring>  
#include<cmath>  
#include<cstdlib>  
#include<iostream>  
#include<algorithm>  
#include<vector>  
#include<map>  
#include<queue>  
#include<stack> 
#include<string>
#include<map> 
using namespace std;  
#define LL long long  
const int maxn=5005;
int a[maxn],b[maxn];
int n;
bool test(int k){//k是最大剩余飞机数量,即最大id加1 
	int A=0,B=0,aneed,bneed,sumab=0,suma=0,sumb=0;//sum是可以给A或B起飞的机会 
	for(int i=0;i<n;i++){
		A+=a[i];
		B+=b[i];
		aneed=max(A-k,0);
		bneed=max(B-k,0);
		if(aneed+bneed>sumab) return false;
		else if(aneed>suma||bneed>sumb) return false;
		if(A==0&&B) B--;
		else if(B==0&&A) A--;
		else if(A&&B){
			if(A+B>sumab)
				sumab++;
			if(A>suma)
				suma++;
			if(B>sumb)
				sumb++;
		}
	}
	return true;
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(int i=0;i<n;i++) scanf("%d%d",&a[i],&b[i]);
		int l=1,r=n*20,mid;
		while(l<r){
			mid=(r+l)/2;
			if(test(mid)) r=mid;
			else l=mid+1;
		}
		int ans=r-1;
		printf("%d\n",ans);

	}
	return 0;
}















 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值