Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round) C.Remove Adjacent

题目大意:给了一个字符串 可以对它进行若干次操作:删除一个字母,前提是它的左右两边至少有一个是它在字母表中的前一个字母.例如b前面的a,s前面的r.求按照什么顺序删除能删除最多的字母.
模拟一下题目给的样例 bacabcab 从0开始计数可以知道0 4 5 7四个位置是可以被删除的.那么删除哪个呢.显然是删掉最大的那个字母,因为剩下的字母串里面肯定没有因为它而不能删除的字母.题目的规模很小.暴力的模拟一下就好了.
附上代码

#define LL long long
#define pb push_back
#include <iostream>
using namespace std;
const int N = 105;
int n;
int num[N];
int vis[N];
string s;
int main() {
    ios::sync_with_stdio(false);
    cin >> n;
    cin >> s;
    int ans = 0;
    while (1) {
        int mp = -1;
        for (int i = 0; i < n; ++i) {
            int p = i - 1, ap = i + 1;
            if (!vis[i]) {
                while (vis[p] && p) p--;
                if (i && s[p] == s[i] - 1 && !vis[p]) {
                    if (mp == -1) mp = i;
                    else if (s[mp] < s[i]) mp = i;
                }
                while (vis[ap] && ap < n-1) ap++;
                if (i != n-1 && !vis[ap] && s[ap] == s[i] - 1) {
                    if (mp == -1) mp = i;
                    else if (s[mp] < s[i]) mp = i;
                }
            }
        }
        if (mp == -1) break;
        ans++;
        vis[mp] = 1;
    }
    cout << ans;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45590210/article/details/104849993