Codeforces Round #681 B
大意
有一串01序列,可以a代价删除一串连续的1,或者以b代价把一个0改成1,问最少代价。
思路
考虑任意相邻相隔的两串1,要么将中间0全改为1然后一次删掉,要么删两次。
结果都是这两串1及中间的0所包含的这一段被标记为删除。
所以在这两种情况中取代价最小的情况。
贪心从从左向右删除即可。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)
int t;
int a, b;
int main() {
cin >> t;
string s;
while(t--) {
cin >> a >> b >> s;
int ls = -10000;
int ans = 0;
for(int i=0; i<s.length(); i++)
if(s[i] == '1') {
ans += min((i-ls-1)*b, a);
ls = i;
}
cout << ans << endl;
}
return 0;
}