题目链接: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; }