题意
给定两个整数a,b。以及一个只包含0
和1
的字符串s。
将1
activate需要费用a,将0
转变成1
需要费用b。
另,将连在一起的1
activate只需要花费一次的a。
问将所有的1
activate需要的最少费用。
数据范围:1≤a,b≤1000,s.length< 1 0 5 10^5 105
思路
首先,在第一个1
之前出现的0
一定不会被转换成1
,并且第一个1
需要被引爆(与第一个1
相连的1
都会被引爆,无论引爆连续的1
中的哪一个1
都会产生同样的效果)
记录从当前1
到下一个1
之间出现的0
的个数(cnt),当碰到s[i] == '1' && s[i - 1] == '0'
时,ans += min(cnt*b, a)
:a
为引爆下一组1
,cnt*b
为拼接上一组的1
(这时就不需要再引爆,但需要将0
转换成1
)
AC的代码
#include <bits/stdc++.h>
using namespace std;
char s[100003] = "0";// 方便第一个`1`的判断
int inf = 0x3f3f3f3f / 1000;
int main() {
int t, a, b, cnt;
long long ans;// 用int会炸
cin >> t;
while (t--) {
cin >> a >> b;
cnt = inf;// 确保第一个`1`被引爆
ans = 0;
scanf("%s", s + 1);
for (int i = 1; s[i]; ++i)
if (s[i] == '0') {
++cnt;
}
else {
if (s[i - 1] == '0')
ans += min(cnt*b, a);
cnt = 0;
}
cout << ans << endl;
}
}