Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) B. Saving the City (貪心,模擬)
阿新 • • 發佈:2020-11-03
-
題意:給你一個\(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; }