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

UVA 1450 Airport (二分)

2016-10-06 15:51 357 查看
这题的难点在于判断哪边飞,如果其中一边为0,那么肯定是不为0的飞,巧妙之处在于如果两边都不为0,那么就留着,一旦两遍超过二分答案的数量超过留着的可以起飞的机数,那么二分答案肯定失败了,重新二分即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=5000+10;
int A[maxn],B[maxn];
int n;
bool ok(int mid)
{
int cura,curb,a,b,num;
cura=curb=num=0;
for(int i=0;i<n;i++)
{
cura+=A[i];curb+=B[i];
a=max(cura-mid,0);b=max(curb-mid,0);
if(a+b>num) return false;
if(cura>0&&curb>0&cura+curb>num) num++;
else if(cura>0&&curb==0) cura--;
else if(cura==0&&curb>0) curb--;
}
return true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d%d",&A[i],&B[i]);
int l=1,r=n*20,mid;
while(l<r)
{
mid=(l+r)/2;
if(ok(mid)) r=mid;
else l=mid+1;
}
printf("%d\n",l-1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: