字母卡片

题目:

https://www.nowcoder.com/practice/9369f06924fa44a4ba2c462504c53297?tpId=122&rp=1&ru=%2Fta%2Fexam-wangyi&qru=%2Fta%2Fexam-wangyi%2Fquestion-ranking

题目描述

给你n张卡片,卡片上仅包含大写英文字母,现你可从这n张卡片中选出k张,要求得到尽可能高的分数。
关于分数的计算方式,在你所选择的k张卡片中,含有相同字母的卡片分数为卡片数乘以相同卡片个数。
就样例而言,选择九张D和其他任意一张,得到的结果为9*9+1 。

输入描述:

输入包含两行,第一行含两个整数n,k(0<k<=n<=1,000,000)

第二行为每张卡片上的字母

输出描述:

输出仅包含一行,输出尽可能高的分数
示例1

输入

15 10 
DZFDFZDFDDDDDDF

输出

82

AC代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int main()
{
    LL a[30];
    int n,k;
    string s; 
    while(cin>>n>>k)
    {
        cin>>s;
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++) a[(int)s[i]-'A']++;
        sort(a,a+26);
        LL res=0;
        for(int i=25;i>=0;i--)
        {
            LL v=min((LL)k,a[i]);//min(long long,long long);数字类型要控制一样样哦 
            res+=v*v;
            k-=v;
        }
        cout<<res<<endl;
    }
    return 0;
} 
 
原文地址:https://www.cnblogs.com/dragondragon/p/13419518.html