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;
}
#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;
}
相关文章推荐
- (advanced) UVA 二分+贪心 1450 - Airport
- uva 1450 - Airport(贪心+二分)
- UVa 1450 Airport (二分+思路)
- UVA 1450 Airport(二分+想法题)
- uva 1450 - Airport(二分)
- UVa 1450 Airport 解题报告(二分+策略)
- UVa 1450 - Airport(二分)
- UVA 1450 Airport (二分)PS:两种思路的改错,想AC就看我!!!
- UVa1450 - Airport
- uva1450 - Airport
- UVA1450-Airport
- UVA 1450 LA 4725 Airport
- UVA 4725 Airport (贪心+二分)
- UVALive - 4725 Airport 分析+二分
- UVALive 4725 Airport 贪心 二分 模拟
- UVA - 1450 Airport
- uva1450-Airport
- uvalive 4725 - Airport (二分)
- UVA1450-Airport
- Uva-1450-Airport