Solution
- (2a>n),一次性结束,直接输出 (n)
- (a geq b),那么一直修即可,直接输出 (n)
- 否则,(a) 占弱势,我们考虑用 (a) 修一半需要的完整轮次数为 ([(n-1)/2a]) ,那么这些轮中, (a) 修掉的个数为 ([n/2a]a),而 (b) 修掉的个数则是 ([n/2], [n/2a]b) 中的较小值。计算剩余量然后暴力修即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,a,b;
signed main() {
int t;
cin>>t;
while(t--) {
cin>>n>>a>>b;
if(2*a>n || a>=b) {
cout<<n<<endl;
}
else {
int d=(n-1)/(2*a);
int xa=d*a;
int xb=min(n/2,d*b);
int r=n-xa-xb;
//cout<<d<<" "<<xa<<" "<<" "<<xb<<" "<<r<<endl;
cout<<d*(a+b)+r<<endl;
}
}
}