C. Remove Adjacent

Posted -ackerman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C. Remove Adjacent相关的知识,希望对你有一定的参考价值。

题目链接:http://codeforces.com/contest/1321/problem/C

 

题意:

给定一个字符串,若字符串中的某个字符的前一个或者后一个是其字典序的前一个字母就可以去掉这个字符,问最多能去掉多少个字符

 

思路:

贪心,每次去掉可以去掉字符的最大字典序的字母,可以脑补一下,如果每次都不去掉当前可以去掉的最大字典序的字母,有可能会导致策略不优,很明显嘛,比如4 bcda,你先去掉c,那么就是bda,只有1,而答案是3,这个需要多想想,其实也很显然的

 

#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <set>
#include <queue>
#include <math.h>
#include <cstdio>
#include <iomanip>
#include <time.h>
#include <bitset>
#include <cmath>
#include <sstream>
#include <iostream>

#define LL long long
#define INF 0x3f3f3f3f
#define ls nod<<1
#define rs (nod<<1)+1

const double eps = 1e-10;
const int maxn = 2e5 + 10;;
const LL mod = 1e9 + 7;

int sgn(double a){return a < -eps ? -1 : a < eps ? 0 : 1;}
using namespace std;


string s;

int n;

bool solve()//尝试删除一个字母
{
    for(int j=25;j>=1;j--)
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!=a+j)
                continue;
            if(i>0)
                if(s[i-1]==a+j-1)
                {
                    s.erase(i,1);
                    return true;
                }
            if(i<s.size()-1)
                if(s[i+1]==a+j-1)
                {
                    s.erase(i,1);
                    return true;
                }
        }
    return false;
}

int main() {
    scanf("%d",&n);
    cin>>s;
    int ans=0;
    while(solve())
        ans++;
    printf("%d
",ans);
    return 0;
}

 

以上是关于C. Remove Adjacent的主要内容,如果未能解决你的问题,请参考以下文章

C. Not Adjacent Matrix1000 / 构造

1047. Remove All Adjacent Duplicates In String做题报告

LF.79.Remove Adjacent Repeated Characters I

LeetCode 1209. Remove All Adjacent Duplicates in String II

LF.82.Remove Adjacent Repeated Characters IV

[LC] 82. Remove Adjacent Repeated Characters IV