UVA - 1450 Airport

题目大意: 有一个飞机场,有两条待飞跑到w和e,一条起飞跑道,每一时刻只能起飞一架飞机,然后有w[i]和e[i]架飞机进入w和e跑道,飞机编号从0开始,问说如何安排起飞可以使得飞机编号的最大值最小。

解题思路: 只要二分搜索,找到最小的答案就可以了,注意跑道上为0时,是没有飞机起飞的。


#include <iostream>
using namespace std;
int n, A[5500], B[5500];

bool judge(int MAX) {
	int Have = 0, W = 0, E = 0;
	for (int i = 0; i < n; i++) {
		W += A[i];
		E += B[i];

		int WNeed = max(W - MAX, 0);
		int ENeed = max(E - MAX, 0);

		if (WNeed + ENeed > Have)
			return false;

		if (W == 0 && E)
			E--;
		else if (E == 0 && W)
			W--;
		else if (W + E > Have)
			Have++;
	}
	return true;
}

int main() {
	int T;
	cin >> T;
	while (T--) {
		cin >> n;
		for (int i = 0; i < n; i++)
			cin >> A[i] >> B[i];

		int L = 1, R = 100000;
		while (L < R) {
			int M = (L + R) / 2;
			if (judge(M))
				R = M;
			else 
				L = M + 1;
		}

		cout << L - 1 << endl;
	}
	return 0;
}


你可能感兴趣的:(UVA - 1450 Airport)