题目
题解
本来很简单一个题但是最近智商真的不行,check没想出好写的方法。找的题解:http://blog.youkuaiyun.com/hyczms/article/details/44105403,还有关于二分的下界为什么不是max(a[i],b[i])而是1我表示不能理解(wa了无数遍),到时候等杯哥做完了再问问。
代码
//QWsin
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=5000+10;
int n,a[maxn],b[maxn];
inline int check(int ans)
{
int A=0,B=0,cnt=0,ga=0,gb=0;
for(int i=1;i<=n;++i)
{
A+=a[i];B+=b[i];
if(A>ans)
{
int k=min(cnt,ga);
if(k<A-ans) return 0;
cnt-=(A-ans);ga-=(A-ans);
A=ans;
}
if(B>ans)
{
int k=min(cnt,gb);
if(k<B-ans) return 0;
cnt-=(B-ans);gb-=(B-ans);
B=ans;
}
if(A > ga) ++ga;if(B > gb) ++gb;
if(A+B>cnt) ++cnt;
}
return 1;
}
inline void solve()
{
cin>>n;
int l=0,r,ans;
for(int i=1;i<=n;++i)
scanf("%d%d",a+i,b+i),r+=max(a[i],b[i]),l=max(l,max(a[i],b[i]));
l=1;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans-1);
}
int main()
{
int T;cin>>T;
while(T--) solve();
return 0;
}