題目大意“給定一段大寫字母序列。
從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;
}