第一章-问题求解策略-LA4725-Airport

分类:二分答案
题目链接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;
}
发布了36 篇原创文章 · 获赞 6 · 访问量 4786

猜你喜欢

转载自blog.csdn.net/STL_CC/article/details/105048842