欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 蓝桥云客第 5 场 算法季度赛

蓝桥云客第 5 场 算法季度赛

2025/4/20 4:55:15 来源:https://blog.csdn.net/zqystca/article/details/145098336  浏览:    关键词:蓝桥云客第 5 场 算法季度赛

题目:

2.开赛主题曲【算法赛】 - 蓝桥云课

问题描述

蓝桥杯组委会创作了一首气势磅礴的开赛主题曲,其歌词可用一个仅包含小写字母的字符串 S 表示。S 中的每个字符对应一个音高,音高由字母表顺序决定:a=1,b=2,...,z=26。字母越靠后,音高越高。

为了增强歌曲感染力,组委会希望从中选取一段子串作为副歌。该子串需满足以下条件:

  • 所有字母都必须唯一。

此外,若副歌包含“lanqiobe”的前缀(例如“l”、“la”、“lan”等),则可额外获得创作灵感加成:

  • “l”: 10 分
  • “la”: 20 分
  • “lan”: 30 分
  • “lanq”: 40 分
  • “lanqi”: 50 分
  • “lanqio”: 60 分
  • “lanqiob”: 70 分
  • “lanqiobe”: 80 分

注意:创作灵感加成只能加一次,且只加最高的那个分数。例如,如果副歌是“la”,只会加 20 分,而不会再加上 10 分。

副歌的感染力 = 所有字母对应的音高之和 + 最高的创作灵感加成。

现在,请你找出最佳副歌子串。若有多个满足条件的子串,则输出字典序最小的一个。

输入格式

第一行包含一个正整数 NN ( 1≤N≤2×105 ),表示字符串 S 的长度。

第二行包含一个仅由小写字母所组成的字符串 S,长度为 N。

输出格式

输出一个字符串,表示最佳副歌子串。如果有多个满足条件的子串,则输出字典序最小的那个。

样例输入

8
lbcaccla

样例输出

cla

运行限制

语言最大运行时间最大运行内存
C++1s256M
C1s256M
Java2s256M
Python33s256M
PyPy33s256M
Go3s256M
JavaScript3s256M

总通过次数: 136  |  总提交次数: 464  |  通过率: 29.3%

难度: 简单   标签: 模拟, 暴力

思路:

1.首先要找出不重复出现字符的字符,以每一个字符为结尾作为子串。

2.利用桶思维,发现出现重复的字符直接break

3.有八个对应字符串得分,我们可以从最大个的开始比较。因为只增加最大得分。

4.感染力和字符串的更新,字典序的比较是很基础的,用stl比较就不多说了。(注意:只有字符串长度一样时候才能直接比较)

代码如下:

#include <iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
using namespace std;
int n;
int ans = -1;  
string s;
string ans_s;
bool mem[30];
int main()
{cin >> n;cin >> s;for(int i = 0 ; i < n ; i++){memset(mem,false,sizeof(mem));int sum = 0;string sc;for(int j = i ; j >= 0 ; j--){int num = s[j] - 'a' + 1;if(mem[num] == false){mem[num] = true;sc += s[j];sum += num; }elsebreak;}reverse(sc.begin(),sc.end());//由于子串是从后往前加,与正常的子串相反,所以要转置一下。if (sc.size() >= 8 && sc.find("lanqiobe")!=string::npos)sum += 80;else if (sc.size() >= 7 && sc.find("lanqiob")!=string::npos)sum += 70;else if (sc.size()>=6 && sc.find("lanqio")!=string::npos) sum += 60;else if (sc.size()>=5 && sc.find("lanqi")!=string::npos)sum += 50;else if (sc.size()>=4 && sc.find("lanq")!=string::npos)sum += 40;else if (sc.size()>=3 && sc.find("lan")!=string::npos) sum += 30;else if (sc.size()>=2 && sc.find("la")!=string::npos) sum += 20;
//	    cout << "以" << i << "为结尾       "<<"出现的子串:" << sc << endl;if(sum > ans)//感染力更大 {ans = sum;ans_s = sc;}else if(sum == ans)//感染力相等,比较字典序 {if(sc.size() < ans_s.size())//比较长度 {ans_s = sc;}else if(sc.size() == ans_s.size() && sc < ans_s){ans_s = sc;}}}cout << ans_s;// 请在此输入您的代码return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词