Example
input
5
abca
2
abca
6
codeforces
1
codeforces
10
codeforces
100
output
aa
abc
cdc
codeforces
题目分析
本题给定若干组测试数据,其中每组测试数据包括一个字符串和一个数字,你需要判断删掉哪些字符,使该字符串的价格小于等于数字(其中各个字符价格为 a = 1 , b = 2 , c = 3 ... z = 26),并且,尽可能保留多的字符,输出最终符合要求的字符串。
具体实现
题目给定的测试数据较大,如果只是简单的调用多重循环,则无法在规定时间内完成程序运行,因此,可以使用 C++ STL 库中的 map 来实现具体操作,顺序判断字符串中的字符是否应该输出,输出符合条件的字符构成最终的字符串
AC代码及注释
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int N = 2e5 + 10;
map<char , int> mp; //map定义为 char 型和 int 型,用于判断输出
int a[N];
int main()
{
int t;
cin >> t; //输入测试数据组数
while(t --)
{
string str; //定义一个字符串用于输入
mp.clear(); //每组测试数据清除 map 中的所有数据
cin >> str;
int p;
cin >> p;
int sum = 0;
int len = str.size(); //保存字符串长度
for(int i = 0 ; i < len ; i ++)
{
a[i] = str[i] - 'a'; //用一个 int 型数组变形保存数据,便于排序
}
sort(a , a + len); //对 int 型数组进行升序排序
for(int i = 0 ; i < len ; i ++)
{
if(sum + a[i] + 1 <= p) //如果加上该字符的总价格小于等于给定价格
{ //则将该数据变形为 char 类型保存记录
sum += a[i] + 1;
mp[a[i] + 'a'] ++;
}
}
for(int i = 0 ; i < len ; i ++) //单次循环顺序遍历
{
if(mp[str[i]] != 0) //如果 map 中记录了该字符,则输出该字符
{
cout << str[i];
mp[str[i]] --; //每输出一次,对应的字符个数 -1
}
}
cout << endl;
}
return 0;
}