UVALive - 4725 Airport 分析+二分

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

解题思路:最小最大值问题,二分进行枚举。先统计一下能起飞的总飞机数和W和E两个跑道能起飞的飞机数,如果该跑道的飞机数超过我们所枚举的飞机数,那么就让其起飞,直到其飞机数小于等于所枚举的飞机数

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 5010
struct plane{
	int E, W;
}P[maxn];
int N;

bool check(int cur) {

	int sumE = 0, sumW = 0, count = 0, couE = 0, couW = 0;
	for(int i = 0; i < N; i++) {
		sumE += P[i].E;
		sumW += P[i].W;
		
		if(P[i].E > cur + 1 || P[i].W > cur + 1) 
			return false;
		while(sumE > cur + 1) {
			if(couE == 0 || count == 0)
				return false;
			count--;
			couE--;
			sumE--;	
		}
		while(sumW > cur + 1) {
			if(couW == 0 || count == 0)
				return false;
			count--;
			couW--;
			sumW--;	
		}
		if(couE < sumE)
			couE++;
		if(couW < sumW)
			couW++;
		if(count < sumE + sumW)
			count++;
	}
	return true;
}

int main() {
	int test;
	scanf("%d",&test);
	while(test--) {	
		scanf("%d",&N);
		int MAX = 0;
		for(int i = 0; i < N; i++) { 
			scanf("%d%d",&P[i].E, &P[i].W);
			MAX += max(P[i].E, P[i].W);
		}

		int left = 0 , right = MAX ;
		while(left < right) {
			int mid = (left + right) / 2;
			if(check(mid)) 
				right = mid;	
			else
				left = mid + 1;
		}
		printf("%d\n",left);
	}
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值