您的位置:首页 > 其它

uvalive 4725(贪心 + 二分)

2015-03-06 21:45 274 查看
题意:有两个飞机场,一个飞机跑道,每个时刻要两个飞机场中飞走一架飞机,有n个时刻,给出了每个时刻两个飞机场增加的飞机数量,每个飞机场的飞机都从0开始编号,问n个时刻后两个飞机场中飞机最大编号最小是多少。

题解:最大值最小,二分,在判断函数中,五个变量,sumw、sume表示两个飞机场一共会有多少飞机,num表示会飞走多少架飞机,numw、nume表示两个飞机场可以各飞走多少架飞机,那么整体判断如果当某个飞机场停的飞机超过枚举的x,就让总数减少到x,如果在减少过程中numx或num提前变为0说明x不满足,一次飞来的飞机数量超过x也说明x不满足。

#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = 5005;
int n, w
, e
;

bool judge(int x) {
int sume = 0, sumw = 0, num = 0, nume = 0, numw = 0;
for (int i = 0; i < n; i++) {
sumw += w[i];
sume += e[i];
if (w[i] > x + 1 || e[i] > x + 1)
return false;
while (sumw > x) {
if (numw == 0 || num == 0)
return false;
num--;
numw--;
sumw--;
}
while (sume > x) {
if (nume == 0 || num == 0)
return false;
num--;
nume--;
sume--;
}
if (numw < sumw)
numw++;
if (nume < sume)
nume++;
if (sume + sumw > num)
num++;
}
return true;
}

int main() {
int t;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
int l = 1, r = 0;
for (int i = 0; i < n; i++) {
scanf("%d%d", &w[i], &e[i]);
r += max(w[i], e[i]);
}
while (l < r) {
int mid = (l + r) / 2;
if (judge(mid))
r = mid;
else
l = mid + 1;
}
printf("%d\n", l - 1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva