题目大意“给定一段大写字母序列。
从n张牌中挑k张,每一张会+选出的牌中与它字母相同牌的数量一样的分数,问最大总分
题目分析:
肯定是贪心地选取当前cnt[i]最大的卡片。所以要用一个cnt数组记录每个数字出现的次数,又因为是大写字母,所以可以映射成1-26.
如下代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100010
using namespace std;
char str[N];
int n,k,a[N];
bool v[N];
int cnt[N];
int main()
{
scanf("%d%d",&n,&k);
scanf("%s",str);
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;i++)
{
a[i]=str[i]-'A'+1;
cnt[a[i]]++;
}
sort(cnt+1,cnt+27);
long long ans=0;
for(int i=26;i>=1;i--)
{
if(cnt[i]==0)
continue;
if(cnt[i]>=k)
{
ans+=(long long)k*k;
break;
}
else if(cnt[i]<k)
{
ans+=(long long)cnt[i]*cnt[i];
k-=cnt[i];
}
}
cout<<ans<<endl;
//while(1);
return 0;
}