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");
}

 

 

發佈了74 篇原創文章 · 獲贊 4 · 訪問量 5041
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章