CF997A Convert to Ones
https://www.luogu.com.cn/problem/CF997A
贪心,模拟,思维
黄色题
贪心,模拟,思维
黄色题
思路:
对于这道题,我们要做的就是在最小花费内将给定的字符串变成全是1的串
操作1:并不能减少0
操作2:为了最小的步数,根据贪心的思想,每次都要选择连续的一段(全是0),并且左右没有更多的0
鉴于我们刚刚的贪心思想,实际上比如Sample#1,01000等价于010,也就是说连续的一段可以视为一个数
也就是说我们要减少0的段数
操作1:可以减少一段,条件是存在两段以上的0(可以把他们转到一起)
操作2:减少一段0
也就是说,当0的段数大于等于2时操作1、2等价,贪心选最小
代价:
min(A,B)*段数
以及最后要加上操作2
记0的段数为x,则答案为
min(A,B)*(x-1)+B
字符串不大,暴力求x即可
具体细节见代码
#include <bits/stdc++.h> using namespace std; const int N = 300030; typedef long long ll; ll n, x, y, cnt; char num[N]; int main() { scanf("%d%d%d", &n, &x, &y); scanf("%s", num + 1); num[0] = '1'; for (int i = 1; i <= n; i ++ ) { if (num[i] == '0' && num[i - 1] == '1') cnt ++ ; } if (cnt == 0) printf("0"); else { ll ans = (cnt - 1) * min(x, y) + y; printf("%lld\n", ans); } return 0; }