Appleman has n cards. Each card has an uppercase letter written on it. Toastman must choose k cards from Appleman's cards. Then Appleman should give Toastman some coins depending on the chosen cards. Formally, for each Toastman's card i you should calculate how much Toastman's cards have the letter equal to letter on ith, then sum up all these quantities, such a number of coins Appleman should give to Toastman.
Given the description of Appleman's cards. What is the maximum number of coins Toastman can get?
The first line contains two integers n and k (1 ≤ k ≤ n ≤ 105). The next line contains n uppercase letters without spaces — the i-th letter describes the i-th card of the Appleman.
Print a single integer – the answer to the problem.
15 10 DZFDFZDFDDDDDDF
82
6 4 YJSNPI
4
In the first test example Toastman can choose nine cards with letter D and one additional card with any letter. For each card with D he will get 9 coins and for the additional card he will get 1 coin.
没什么好说的。。。简单的贪心 还WA了两发 无语
做之前还想了的 感觉不会超int的 最后的答案I64 储存就好了
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#define eps 1e-8
#define op operator
#define MOD 10009
#define MAXN 100100
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FOV(i,a,b) for(int i=a;i>=b;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define REV(i,a,b) for(int i=a-1;i>=b;i--)
#define MEM(a,x) memset(a,x,sizeof a)
#define ll __int64
using namespace std;
char ch[100010];
int num[30];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
//freopen("ceshi.txt","r",stdin);
int n,k;
while(scanf("%d%d\n",&n,&k)!=EOF)
{
scanf("%s",ch);
MEM(num,0);
for(int i=0;i<n;i++)
{
num[ch[i]-'A']++;
}
sort(num,num+26,cmp);
int cnt=0;
int x=0;
ll sum=0;
while(cnt!=k)
{
// cout<<"num "<<num[x]<<"sum "<<sum<<endl;
if((k-cnt)>=num[x])
{
cnt+=num[x];
sum=sum+(ll)num[x]*(ll)num[x];
}
else
{
sum=sum+(ll)(k-cnt)*(ll)(k-cnt);
cnt=k;
}
x++;
}
printf("%I64d\n",sum);
}
return 0;
}