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 — thei-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 withD he will get 9 coins and for the additional card he will get 1 coin.
题目大意:
给出n个字母,要求在里面选k个字母,每个字母都可以获得一定的金币,规则是:每个字母可以获得的金币 = 该字母在你选的字母串中的数量。
解法:
每个字母获得的金币跟该字母在选取串中有直接的关系,所以,当然是选取越多的同个字母获得的金币越多,可以用贪心,按照字母的个数排序,优先选个数多的字母。
代码:
#include <cstdio>
#include <iostream>
#define LL long long
using namespace std;
int n;
LL a[30], ans, k;
bool use[30];
void init() {
scanf("%d%I64d\n", &n, &k);
for (int i = 1; i <= n; i++) {
char ch;
scanf("%c", &ch);
a[ch-'A'+1]++;
}
}
void solve() {
while (k) {
LL maxn = 0;
int maxx;
for (int i = 1; i <= 26; i++)
if (!use[i] && a[i] > maxn) {
maxn = a[i];
maxx = i;
}
use[maxx] = true;
if (k >= maxn) {
k -= maxn;
ans += maxn*maxn;
}
else {
ans += k*k;
k = 0;
}
}
cout << ans << endl;
}
int main() {
init();
solve();
}