首页 > 试题广场 >

字母卡片

[编程题]字母卡片
  • 热度指数:5535 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给你n张卡片,卡片上仅包含大写英文字母,现你可从这n张卡片中选出k张,要求得到尽可能高的分数。
关于分数的计算方式,在你所选择的k张卡片中,含有相同字母的卡片分数为卡片数乘以相同卡片个数。
就样例而言,选择九张D和其他任意一张,得到的结果为9*9+1 。

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

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


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

输入

15 10 
DZFDFZDFDDDDDDF

输出

82
import sys
if __name__=="__main__":
    lines = sys.stdin.readlines()
    while lines:
        [n, k] = list(map(int, lines.pop(0).strip().split()))
        nums = lines.pop(0).strip()
        from collections import Counter
        a = dict(Counter(nums))
        A = sorted(dict(Counter(nums)).values())
        if k <= A[-1]:
            print(k*k)
        else:
            A = A[::-1]
            res = 0
            while k > A[0]:
                res += A[0]*A[0]
                k -= A[0]
                A.pop(0)
            res += k*k
            print(res)

题目没有说一次给出多个样例啊,感觉这个还是得讲出来吧。
发表于 2020-06-08 20:42:37 回复(0)

while True:
    try:
        s1,s2 = list(map(int,input().strip().split()))
        str_count = input()
        a=[]   
        from collections import Counter
        count = Counter(str_count)
        count_1=count.most_common()[:]
        for i in range(len(count_1)):
            a.append(count_1[i][1])
        cal=[]
        for i in range(len(count_1)):
            s2 = s2-a[i]
            if s2<0:
                cal.append(s2+a[i])
                break
            else:
                cal.append(a[i])
        answer =0
        for j in range(len(cal)):
                answer += cal[j]**2
        print(answer)
    except:
        break

发表于 2019-09-15 20:52:47 回复(0)