UVA - 1450 Airport
2015-02-20 00:36
357 查看
题目大意: 有一个飞机场,有两条待飞跑到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;
}
解题思路: 只要二分搜索,找到最小的答案就可以了,注意跑道上为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(二分+想法题)
- UVA 1450 LA 4725 Airport
- UVA 1450 Airport (二分)PS:两种思路的改错,想AC就看我!!!
- uva1450 - Airport
- uva 1450 - Airport(贪心+二分)
- UVa 1450 - Airport(二分)
- UVa 1450 Airport 解题报告(二分+策略)
- UVA1450-Airport
- uva 1450 - Airport(二分)
- UVa1450 - Airport
- UVa 1450 Airport (二分+思路)
- UVA1450-Airport
- (advanced) UVA 二分+贪心 1450 - Airport
- uva1450-Airport
- Uva-1450-Airport
- UVA 1450 Airport (二分)
- UVA 1450
- UVALive - 4725 Airport
- uva11168 Airport
- Uva 11168 Airport(凸包)