题目


解题思路
今天这道题还算简单,看一遍大概就有思路,读一遍题后大致能想出来是一个区间查找问题,最适合用二分去做,这道题恰好适合学习了二分的基础的小伙伴来练手,
肯定是每个相隔一个放棋子能最大化利用空间,这样能在满足条件的基础上最大包容的其中一种棋子数量是(nn+1)/2(向上取整)
那么这道题就是在满足**nn>=a+b**,且**(n*n+1)/2>=max(a,b)**,首先a,b范围0~1000000000,那么至少边长为50001的方格能放得下a+b,我们用二分答案来做,范围也就出来了,利用模版一找最小值n.
二分不熟悉的小伙伴请看这篇:二分查找&二分答案【模板+例题】带你精通二分!
代码实现
cpp
void solve()
{
int a,b;cin>>a>>b;
int mx=max(x,y);
int l=1,r=50005;
while(l<r)
{
int mid=l+r>>1;
if(mid*mid>=a+b&&(mid*mid+1)/2>=mx)r=mid;
else l=mid+1;
}
cout<<l<<endl;
}