您的位置:首页 > 大数据 > 人工智能

uvalive 4725 - Airport (二分)

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

思路:这个check的时候…..非常非常重要,非常非常容易判断错误….拿std叉了若干时间才发现。要知道当前第一个跑道最多能飞多少,第二个跑道最多能飞多少,两个跑道一共能飞多少,都是一样的思维方式。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 5000 + 5;
int a[maxn], b[maxn];
bool judge(int mid, int n)
{
int can1 = 0, can2 = 0, canTot = 0, sum1 = 0, sum2 = 0;
for(int i = 0; i < n; i++)
{
sum1 += a[i], sum2 += b[i];
int delta1 = max(0, sum1 - mid);
int delta2 = max(0, sum2 - mid);

if(delta1 > can1 || delta2 > can2)
{return false;}
if(delta1 + delta2 > canTot)
{return false;}
if(sum1 - can1 > 0) can1++;
if(sum2 - can2 > 0) can2++;
if(sum1 + sum2 - canTot > 0)    canTot++;
}
return true;
}
int main()
{
int T, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i = 0; i < n; i++)  scanf("%d%d", &a[i], &b[i]);
int lb = 0, rb = 1e9;
while(lb < rb)
{
int mid = (lb + rb) / 2;
if(judge(mid, n))   rb = mid;
else lb = mid + 1;
}
printf("%d\n", max(0, rb - 1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: