3. 录入成绩【算法赛】{这题通过率是不是有点高!}——《蓝桥杯》第 24 场 小白入门赛
问题描述
点击查看题目信息
蓝桥杯全国总决赛的颁奖典礼结束后,小蓝被分配了一个任务——录入部分获奖选手的奖项信息。
他用 "G"、"G1"、"G2"、"G3"、"GG"、"1"、"2"、"3" 这些字符串分别表示国特、国一、国二、国三、国优、省一、省二、省三等级。为了提高效率,小蓝写了个 Python 脚本来自动录入这些字符串。但是,小蓝过于粗心,竟忘记在各个奖项代码之间加分隔符!这就导致运行完脚本后,所有的奖项信息都挤在一起变成了一串长长的字符串,例如 "GG123G1G2G3123G1"。
小蓝的头发都快掉光了!他知道这部分选手中,每个奖项都至少有一位获奖选手,且国特只有一位。现在,他对着这串乱糟糟的字符串 S,想知道这部分选手中最多可能有多少位选手获得了国一("G1")。
对此,请你帮帮可怜的小蓝,找出字符串 S 中最多可能有多少个 "G1"。
## 输入格式
输入一个字符串 S,包含了所有的奖项信息,字符串长度不超过 2×10^3。
S 由 "G"、"G1"、"G2"、"G3"、"GG"、"1"、"2"、"3" 组成,保证 S 是合法的。
## 输出格式
输出一个整数,表示字符串
S中最多可能包含的 "G1" 的个数。
## 样例输入
GG123GG2G1G2G3123
## 样例输出
2
解法思路
题目的核心就是每个奖项都至少有一位获奖选手,且国特只有一位。,所以要对S中的G枚举国特,记录除当前G剩下的字符串中G1的最大数量。注意要记录下是不是每个奖项都至少有一位获奖选手,且不能有国特(因为国特已经被考虑了)可以用unordered_map记录,最后查询一下key的数量。
代码
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
string s;
cin>>s;
int ans = 0;
for (int i=0; i<s.length(); i++) {
if (s[i] == 'G') {
string t = s;
t.erase(i, 1); //麻烦一点写法是拼接substr()
int j = 0;
unordered_map<string, int> mp; //记录key,即奖项种类
while (j < t.length()) {
if (t[j] == 'G') {
mp[t.substr(j, 2)]++;
j += 2;
} else {
mp[t.substr(j, 1)]++;
j++;
}
}
if (mp.find("G") == mp.end() && mp.size() == 7) //map的key只有7个且不包含G
ans = max(ans, mp["G1"]); // 记录G1最大数量
}
}
cout<<ans<<endl;
return 0;
}