CodeForces - 1321C Remove Adjacent(贪心+模拟)

题目链接:点击查看

题目大意:给出一个长度不超过100且只包含小写字母的字符串,现在规定,如果某个位置 i 的相邻位置存在着当前位置所代表字母的前一个字母,即 i - 1 和 i + 1 中存在着 a[ i - 1] = a[ i ] - 1 或 a[ i + 1 ] = a[ i ] - 1 ,则代表位置 i 的字母可以删除,两侧子串拼接起来,问最多可以进行删除操作多少次

题目分析:读懂题后首先需要知道,字母 ' a ' 是一定不可能删除的,因为题目中规定 a 没有前一个字母,这样的话我们就可以贪心,每次对最大的字母进行尝试删除,因为字符串最长只有100,所以我们每次可以 26 * n 的时间复杂度找到一个可以删除的字母并进行删除,最多只需要删除 n 次,总时间复杂度也就是 26 * n * n,每次只删除一个字母,直到不能删除为止

删除操作直接模拟就好了,配合stl的string类可以轻松完成

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;
      
typedef long long LL;
     
typedef unsigned long long ull;
      
const int inf=0x3f3f3f3f;
 
const int N=110;
 
string s;
 
int n;
 
bool solve()//尝试删除一个字母
{
	for(int j=26;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()
{
#ifndef ONLINE_JUDGE
//	freopen("input.txt","r",stdin);
//	freopen("output.txt","w",stdout);
#endif
//	ios::sync_with_stdio(false);
	//ccab
	//ddbc
	scanf("%d",&n);
	cin>>s;
	int ans=0;
	while(solve())
		ans++;
	printf("%d\n",ans);
 
 
 
 
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}
发布了672 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_45458915/article/details/104616629
今日推荐