分类:二分答案
题目链接LA4725-Airport
注意check函数的写法,其他的跟普通二分法无异,这里的check函数写法是一个亮点
可以看看模板
三种常见的二分答案模板
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=5000+50;
int a[maxn],b[maxn];
int l,r,T,n;
bool check(int ck)
{
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 - ck);
int delta2 = max(0, sum2 - ck);
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()
{
scanf("%d",&T);
while(T--)
{
l=0,r=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&a[i],&b[i]);
r+=a[i]+b[i];
}
while(l<=r)
{
int mid=(l+r)/2;
if(check(mid))
{
r=mid-1;
}
else
{
l=mid+1;
}
}
printf("%d\n",max(0,r));
}
return 0;
}