总结
这个题有两种写法,一种二分,一种数学方法
自己的第一想法是推公式,没有二分的想法,后面看了别人的写法, 用二分确实也不错
问题
1:左边界是从n开始(因为每个单位都要铺沥青),右边界1e18毋庸置疑
2:求最小,大于等于ans的所有情况都满足
3:二分是lower_bound写法,自己每次写也不是特别熟悉,有点慢。
signed main()
{
IOS;
//file();
int t;
cin>>t;
while(t--)
{
int n,g,b,ans;
cin>>n>>g>>b;
int l=n,r=1e18,num=n/2+n%2;
while(l<=r)
{
int mid=(l+r)>>1;
int temp=mid/(g+b)*g+min(mid%(g+b),g);
if(temp>=num)
ans=mid,r=mid-1;
else
l=mid+1;
}
cout<<ans<<endl;
}
return 0;
}