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;
}
题解:最大值最小,二分,在判断函数中,五个变量,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;
}
相关文章推荐
- UVALive 4725 Airport 贪心 二分 模拟
- UVALive 3177 && uva 1335 Beijing Guards (贪心+二分)
- UVALive 3177 - 长城守卫(二分+贪心)
- uvalive 4725 - Airport (二分)
- UVALive 3971 Assemble 电脑配件 二分+贪心
- UVaLive 3971 Assemble (水题二分+贪心)
- UVA 4725 Airport (贪心+二分)
- uvalive 4254 Processor处理器 (二分模拟+贪心)
- UVALive 3971 Assemble(二分 + 贪心)
- UVALive 2949 Elevator Stopping Plan(二分 + 贪心)
- UVALIVE 5000 Underwater Snipers(二分+贪心)
- UVALIVE 2949 Elevator Stopping Plan(二分 + 贪心)
- UVA 12124 UVAlive 3971 Assemble(二分 + 贪心)
- UVA 12124 UVAlive 3971 Assemble(二分 + 贪心)
- UVA 12124 UVAlive 3971 Assemble(二分 + 贪心)
- uvalive 3971 - Assemble(二分搜索 + 贪心)
- UVALIVE 3971 Assemble 二分+贪心
- uvalive3971(二分+贪心)
- uvalive 2949(二分+贪心)
- UVALive 3177-贪心+二分