原文链接:http://codeforces.com/problemset/problem/462/B
思路:
题目大概意思是说,给一个大写字母的序列,每个字母的得分是其出现的次数。现在要在这n个字符里找出k个字符,使得得分最大。求最大值。
是贪心算法的一道基本题。
思路的话,我们从输入入手,就是先统计输入的字符串中,每个字符各占多少。然后用sort进行排序,排序后按数量最多的开始拿,直到符合要求为止,计算最后的价值即可。
#include <iostream>
#include <cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
int cs[26];
int n,k;
int main()
{
int n,k;
scanf("%d%d",&n,&k);
string c;
cin>>c;
memset(cs,0,sizeof(cs));
for(int i=0;i<n;i++)
{
cs[c[i]-'A']++;//统计每个字符的数量
}
sort(cs,cs+26);//将cs数组里每个字符存储的数量按照从小到大排
long long x=0,ans=0;
for(int j=25;k>0;j--)
{
x=min(k,cs[j]);//先从字符数量最多的开始拿
k-=x;
ans+=x*x;//计算价值
}
cout<<ans<<endl;
return 0;
}