题目
? ? ? ? ? ? ? ? 小红拿到了仅有小写字母构成的字符串,她有一个按钮可以生成字母,按一下得到“a”,按两下得到“b”,按三下得到“c”;现在给他一个字符串和允许按按钮的次数,她通过按按钮来得到字符,每个字符记一分,请问他最大的得分,注意每个字符只能用一次(即"abaa“,5,她只能选3个a,或者2个a一个b,不过肯定是前面)
思路
? ? ? ? ? ? ? ? 肯定是先按a再按b,这样的流程吗,因为每个字符都是一分,(就相当于你去买东西,大家的商品都一样,a要一块钱一件,b要2块,c要三块,d要四块)
? ? ? ? ? ? ? ? 想到这儿,思路就出来了,循环26次,统计每个字符的数量,同时判断需要的次数在不在范围内,以及累加得到的分数
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(){
int n,k;
cin >> n >> k;
string s;
cin >> s;
char ch = 'a';
int ans = 0;
for (int i = 0; i < 26;++i){
int num = count(s.begin(), s.end(), char(ch+i));
if (num==0){
continue;
}
if (num*(i+1)<= k){
ans = ans + num;
k = k - num * (i + 1);
}else{
ans = ans + k / (i + 1);
break;
}
}
cout << ans << endl;
getchar();
return 0;
}
? ? ? ? ? ? ? ? 复杂度为26*O(log n) count 函数是O(log n )。count函数的复杂度是线性的,最坏情况是O(n)
|