Codeforces 1303 B National Project

你要修一条长度为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");
}

猜你喜欢

转载自blog.csdn.net/Luowaterbi/article/details/104297635