你要修一条长度为n的路,g天连续的好天气和b天连续的坏天气轮流出现,好天气修的是好路,坏天气修的是坏路,可以在某一天不工作,既不修路,问将路修完并且好路占绝对一半(奇数是/2+1)所需的天数。
我们把(g+b)当作一个循环。
如果g>=b,我们可以一直修路,因为一个循环内任意时间好路的长度都>=坏路的长度,一直修即可,直接输出n。
如果g<b,我们就需要考虑在坏天气的时候不工作。
gd表示需要的好天气的天数,bdd表示剩下的可以为坏天气的天数。time表示除了最后一次的所需的循环数,res表示最后一次循环还要多少好天气。当res==0的时候要让time-1,res=g。bd表示除了最后一次循环的所有坏天气的数量。
bd>=bdd意味着在之前循环的时候我们就可以把需要的坏路给修完,剩下的坏天气不工作即可,那么答案ans=循环的总天数加上最后需要的好天数。
bd<bdd否则我们在最后一次干完所需的好天气res之后还要继续干。由于res之后就满足好路的条件了,所以修的是好路还是坏路都无所谓,直接加上bdd-bd即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll t,n,g,b;
cin>>t;
while(t--)
{
cin>>n>>g>>b;
if(g>=b) cout<<n<<endl;
else
{
ll gd=(n+1)/2,bdd=n-gd;
ll time=gd/g,res=gd%g;
if(res==0) --time,res=g;
ll bd=time*b,ans;
if(bd>=bdd) ans=time*(g+b)+res;
else ans=time*(g+b)+res+bdd-bd;
cout<<ans<<endl;
}
}
//system("pause");
}