第一章-问题求解策略-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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值