C. Remove Adjacent(ranting 1600)超详细题解

C. Remove Adjacent(ranting 1600)超详细题解


文章目录

  • C. Remove Adjacent(ranting 1600)超详细题解
    • 前言
    • 一、题目及翻译
      • 1. 原题(贴图)
        • 2. 翻译
    • 二、解析及AC代码
        • 1.解析
        • 2.AC代码


前言

本系列的意义在于两点,一则是作为本人(一个编程初学者)的学习笔记记录,二则希望能对后来者提供一些帮助,因为本人也为新手,难免有些错误或讲述不清之处,恳请大家指出或提出建议,本人也会虚心修改。

本系列的目标是帮助大家解决一些codeforces上,ranting1600+(或者之后会改为1300+,看博主水平吧)的题目


一、题目及翻译

1. 原题(贴图)

C. Remove Adjacent(ranting 1600)超详细题解_第1张图片
【戳我跳转到题目】

2. 翻译
  1. 机翻版
    C. Remove Adjacent(ranting 1600)超详细题解_第2张图片
  2. 省流版
    对字符串S进行处理,删除其中的字符S[i],这个s[i]相邻的有比它小1的,就可以删除,求最多可以删多少个

二、解析及AC代码

1.解析

首先每次对最大的字母进行尝试删除,因为字符串最长只有100,所以我们每次可以 26 * n 的时间复杂度找到一个可以删除的字母并进行删除,最多只需要删除 n 次,总时间复杂度也就是 26 * n * n,每次只删除一种字母,直到不能删除为止

那么,此时同学们就可以自己去尝试一下了,如果还是不太理解,可以参考下博主下面的AC代码

2.AC代码
#define _CRT_SECURE_NO_WARNINGS 01

#include 
#include 
#include 

using namespace std;

typedef long long LL;

const int N = 2e5 + 10, M = 2e5 + 10;

int n, t, k, m;
char s[N];
bool st[N];
vector<int>q[26];

void solve()
{
  int res = 0;
  cin >> n;
  scanf("%s", s);
  for (int i = 25; i > 0; i--)
  {
  	char y = i + 'a', z = i - 1 + 'a';
  	for (int j = 0; j < n; j++)
  	{
  		if (s[j] == y)
  		{
  			int l = j - 1, r = j + 1;
  			while (s[l] == '0' || s[l] == y)
  			{
  				l--;
  			}
  			if (l >= 0)
  			{
  				if (s[l] == z)
  				{
  					res++;
  					s[j] = '0';
  					continue;
  				}
  			}
  			while (s[r] == '0' || s[r] == y)
  			{
  				r++;
  			}
  			if (r < n)
  			{
  				if (s[r] == z)
  				{
  					res++;
  					s[j] = '0';
  				}
  			}
  		}
  	}
  }
  cout << res << endl;
}

int main()
{
  solve();
}

如果觉得有用还请点个赞吧,拜托拜托

你可能感兴趣的:(codeforces,c++,算法,数据结构,贪心算法)