题意:消去一个连续的1的区间花费a元,将0变1花费b元,求字符串全为0的最小花费。
题解:局部贪心。总花费最小,可以由每次花费最小得到。故每次选择两个连续的1的区间,比较消两次和补1消一次的花费,取小累加。
#include<bits/stdc++.h>
using namespace std;
char s[100010];
int main()
{
int t, a, b;cin >> t;
while (t--){
cin >> a >> b >> s;
int i, len = strlen(s), cnta = 0, cntb = 0, l = 0, r = 0;
while (r < len && s[r] == '0')
r++;
if (r < len) cnta = 1;//字符串有1则至少消一次
l = r;
while (r < len){
while (r < len && s[r] == '1')//第一个1的区间取到最右边的1为止
r++;
if (r == len) break;
l = r - 1;
while (r < len && s[r] == '0')//第二个1的区间取到最左边的1为止
r++;
if (r == len) break;
if (2 * a < a + (r - l - 1) * b) cnta++;//core
else cntb += (r - l - 1);//
}
cout << a * cnta + b * cntb << endl;
}
}