CF1550B

给你一个01串,要求每次删除连续的0或者1,求把所有字符全部删除的最少操作次数

设串\(str = s_1s_2s_3...s_n\)由n个块组成,其中\(s_i\)为0串或1串,满足\(s_i\)\(s_{i - 1}\), \(s_{i + 1}\)不同,那么能够获得最少操作次数的删除方式为每次删除第二个块,这样每次删除后块数减少2

n为偶数时,次数为(n - 2) / 2 + 2, n为奇数时,次数为(n - 1) / 2 + 1,都等价于\(\lfloor n/2\rfloor + 1\)

#include<iostream>
#include<string>

using namespace std;

const int N = 110;

int t, n, a, b;
string s;
int q[N];

void solve(){
    cin >> n >> a >> b >> s;
    int cnt = 1;
    for(int i = 1; i < s.size(); i ++)
        if(s[i] != s[i - 1]) cnt ++;
    
    cout << a * n + max(n * b, (cnt / 2 + 1) * b)  << endl;
}

int main(){
    cin >> t;
    while(t --) solve();
}
posted @ 2021-10-12 19:26  yys_c  阅读(44)  评论(0编辑  收藏  举报