【Not a Cheap String】(Codeforces)

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;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值