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

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

2020-04-01 18:54 627 查看

分类:二分答案
题目链接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;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
STL_CC 发布了36 篇原创文章 · 获赞 6 · 访问量 4612 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: