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;
}

 

posted @ 2022-08-10 10:24  -イレイナ  阅读(41)  评论(0)    收藏  举报