你要修一條長度爲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");
}