列表

详情


WY76. 字母卡片

描述

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

输入描述

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

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

输出描述

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

示例1

输入:

15 10 
DZFDFZDFDDDDDDF

输出:

82

原站题解

C++ 解法, 执行用时: 8ms, 内存消耗: 1528KB, 提交时间: 2019-11-21

#include <bits/stdc++.h>
#define LL long long
#define pb push_back
#define endl "\n"
#define FIN freopen("1.in","r",stdin)
#define mem(x,v) memset(x,v,sizeof(x))
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
using namespace std;
const int N = 26;
LL n,k,ans;
string s;
LL ch[N];
int main()
{
    ios::sync_with_stdio(false);
    while(cin>>n>>k>>s){
        ans = 0;
        mem(ch,0);
        rep(i,0,n){
            ch[s[i]-'A']++;
        }
        sort(ch,ch+N,greater<LL>());
        LL r = 0;
        while(k){
            if(k>ch[r]){
                ans+=ch[r]*ch[r];
                k-=ch[r];
                r++;
            }else{
                ans+=k*k;
                k = 0;
            }
 
        }
        cout<<ans<<endl;
    }
    return 0;
}

C++ 解法, 执行用时: 8ms, 内存消耗: 3640KB, 提交时间: 2020-07-28

#include <bits/stdc++.h>
#define LL long long
#define pb push_back
#define endl "\n"
#define FIN freopen("1.in","r",stdin)
#define mem(x,v) memset(x,v,sizeof(x))
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
using namespace std;
const int N = 26;
LL n,k,ans;
string s;
LL ch[N];
int main()
{
    ios::sync_with_stdio(false);
    while(cin>>n>>k>>s){
        ans = 0;
        mem(ch,0);
        rep(i,0,n){
            ch[s[i]-'A']++;
        }
        sort(ch,ch+N,greater<LL>());
        LL r = 0;
        while(k){
            if(k>ch[r]){
                ans+=ch[r]*ch[r];
                k-=ch[r];
                r++;
            }else{
                ans+=k*k;
                k = 0;
            }
  
        }
        cout<<ans<<endl;
    }
    return 0;
}

上一题