下面贴上一个题目,提示自己要注意数据,不要溢出了!
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.
paste my code:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e5+5;
char record[maxn];
int main()
{
LL cot[28];//改编数据的类型!
for (int i=0; i<26; i++){
cot[i] = 0;
}
LL n, k;//原来是int ,后来改变数据的类型就过了
cin>>n>>k;
for (int i=0; i<n; i++){
cin>>record[i];
cot[record[i]-65]++;
}
sort(cot, cot+26);
int index = 25;
LL sum =0 ;
while (k){
if(k>cot[index]){
k -= cot[index];
sum += cot[index]*cot[index];//虽然不是很理解大数的乘法,但是两个在整数范围内的数相乘,若他们的结果超过了整数的范围,那么就会溢出
index--;
}
else{
sum += k*k;
k = 0;
}
}
cout<<sum<<endl;
return 0;
}