1. 程式人生 > 實用技巧 >Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) B. Saving the City (貪心,模擬)

Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) B. Saving the City (貪心,模擬)

  • 題意:給你一個\(01\)串,需要將所有的\(1\)給炸掉,每次炸都可以將一整個\(1\)的聯通塊炸掉,每炸一次消耗\(a\),可以將\(0\)轉化為\(1\),消耗\(b\),問將所有\(1\)都炸掉的最小花費.

  • 題解:貪心,如果\(1\)存在,那麼我們至少要炸一次,然後可以列舉統計兩個連通塊之間的\(0\)的個數,判斷是將這些\(0\)變為\(1\)然後炸一次的花費小,還是炸掉\(2\)個連通塊的花費小,思路就是這樣,具體實現見程式碼.

  • 程式碼:

    int t;
    int a,b;
    string s;
     
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        cin>>t;
        while(t--){
            cin>>a>>b;
            cin>>s;
     
            int l=0,r=0;
            int cnt0=0,cnt1=0;
            int len=(int)s.size();
            while(l<len && s[l]=='0') l++;
            if(l<len) cnt1=1;
            r=l;
            while(r<len){
                while(r<len && s[r]=='1') r++;
                if(r==len) break;
                l=r-1;
                while(r<len && s[r]=='0') r++;
                if(r==len) break;
                if((r-l-1)*b<a) cnt0+=(r-l-1);
                else cnt1++;
            }
            cout<<cnt0*b+cnt1*a<<'\n';
        }
     
        return 0;
    }