首页 > 试题广场 >

名字的漂亮度

[编程题]名字的漂亮度
  • 热度指数:152908 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}对于给定由小写字母构成的字符串,定义字符串的“漂亮度”为该字符串中所有字母“漂亮度”的总和。
\hspace{15pt}每一个字母的“漂亮度”将由你来确定,具体规则如下:
\hspace{23pt}\bullet\,每一个字母的“漂亮度”为 126 之间的整数;
\hspace{23pt}\bullet\,没有两个字母的“漂亮度”相同。
\hspace{15pt}现在,你需要确定每个字母的“漂亮度”,以使得字符串的“漂亮度”最大。

输入描述:
\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1\leqq T\leqq 10\right) 代表数据组数,每组测试数据描述如下:

\hspace{15pt}在一行上输入一个长度为 1 \leqq {\rm len}(s) \leqq 10^4 、仅由小写字母构成的字符串 s


输出描述:
\hspace{15pt}对于每一组测试数据,输出一个整数,表示字符串的最大“漂亮度”。
示例1

输入

2
zhangsan
lisi

输出

192
101

说明

\hspace{15pt}对于第一组测试数据,其中一种最优的分配方案是:
\hspace{23pt}\bullet\,将字符 \texttt{`a'} 的漂亮度分配为 26
\hspace{23pt}\bullet\,将字符 \texttt{`n'} 的漂亮度分配为 25
\hspace{23pt}\bullet\,将字符 \texttt{`g'}, \texttt{`z'}, \texttt{`h'}, \texttt{`s'} 的漂亮度依次分配为 24 \sim 21
\hspace{23pt}\bullet\,其余字符随意分配;
\hspace{15pt}最终,得到字符串的“漂亮度”为 (26 + 25) \times 2 + (24 + 23 + 22 + 21) = 192

\hspace{15pt}对于第二组测试数据,其中一种最优的分配方案是:
\hspace{23pt}\bullet\,将字符 \texttt{`i'} 的漂亮度分配为 26
\hspace{23pt}\bullet\,将字符 \texttt{`l'} 的漂亮度分配为 25
\hspace{23pt}\bullet\,将字符 \texttt{`s'} 的漂亮度分配为 24
\hspace{23pt}\bullet\,其余字符随意分配;
\hspace{15pt}最终,得到字符串的“漂亮度”为 26 \times 2 + (25 + 24) = 101
n=int(input())
while 1:
    try:    
        name=input()
        res=sorted([(char,name.count(char)) for char in set(name)],key=lambda x:x[1],reverse=True)
        sum=0
        for i in range(len(res)):
            sum+=res[i][1]*(26-i)
        print(sum)
    except:
        break


发表于 2025-01-01 21:07:57 回复(0)
# 定义漂亮度函数
def nicenamescore(name):
    name_set = set(name.lower())  # 名字全部小写字母集合
    # name_elem_len = len(name_set)  # 获取名字字母集合的大小

    # 生成名字字母个数的列表
    name_elem_cnt = []
    for elem in name_set:
        name_elem_cnt.append(name.lower().count(elem))

    # 生成降序排列的名字字母个数列表
    elem_cnt_desc = sorted(name_elem_cnt, reverse=True)  # 根据出现的次数按照从大到小排列

    # 计算名字漂亮度
    score = 0  # 初始化漂亮度为0
    for i in range(len(elem_cnt_desc)):
        score += (26 -i) * elem_cnt_desc[i]
    return score



# 循环处理逻辑
while True:
    try:
        # 数据输入
        n = int(input().strip())  # 输入名字的个数
        # 外部输入每一行的名字同时打印一个漂亮度
        for k in range(n):
            name = input().strip()  # 输入名字
            print(nicenamescore(name))  # 输出名字漂亮度
    except:
        break

发表于 2023-03-21 15:44:46 回复(0)
将出现的字母按从多到少排序,26减去在列表中的下标就是字母的漂亮度,最后遍历名字累计漂亮度即可
n = int(input())
for i in range(n):
    s = input()
    typ = list(set(s))
    typ.sort(key = lambda x:s.count(x),reverse=True)
    score = 0
    for i in s:
        score += 26-typ.index(i)
    print(score)

发表于 2022-10-14 11:15:18 回复(0)
n = int(input())
ls = []
for _ in range(n):
    ls.append(input())
def maxbeautiful(s):
    char = sorted(list(s)) #将字符串排序,这样相同字母的就在一起
    i = 1
    a = 1
    res = []
    #计算每个字母出现的次数,加到列表里
    while i < len(char):
        if char[i] == char[i-1]:
            a += 1
            i += 1
        else:
            res.append(a)
            a = 1
            i += 1
    res.append(a)
    #将出现次数列表降序排列
    res.sort(reverse=True)
    ans = 0
    #然后最大的数乘26,依次递减,算出总和
    for i in range(len(res)):
        ans += res[i]*(26 - i)
    return ans
for item in ls:
    print(maxbeautiful(item))

发表于 2022-09-16 00:57:28 回复(0)
res = []
n = int(input())
while True:
    try:
        res.append(input())
    except:
        for s in res:
            tem = []
            res = 0
            for alpha in list(set(s)):
                tem.append(s.count(alpha))
            tem = sorted(tem, reverse=True)
            for i in range(len(tem)):
                res += tem[i] * (26 - i)
            print(res)
        break

发表于 2022-09-14 04:17:17 回复(0)
num = int(input())
for _ in range(num):
    s = input().lower()
    dct = {}
    n = 0
    n1 = 26
    for ch in s:
        if ch in dct:
            dct[ch] += 1
        else:
            dct[ch] = 1
    li = list(dct.values())
    li.sort(reverse = True)
    for i in li:
        n += i*n1
        n1 -= 1
    print(n)

发表于 2022-09-07 23:01:28 回复(0)
def number(x):#统计各个字符的个数
    y={}
    c=[]
    for i in x:
        if i not in c:
            c.append(i)
            y[i]=1
        else:
            y[i]=y[i]+1
    d=sorted(y.items(), key=lambda x:x[1],reverse=True)#从大到小排序
    d=dict(d)
    return d #字符串按出现顺序的字符的个数
    
def piaoliangdu(x):#对d里的每个数字进行赋值,次数出现最多的赋值最大
    y=number(x)
    #sum=[]#存入所有可能的漂亮度总和
    n={}#存入每个字符的漂亮度
    m=0
    for i in y.keys():
        for j in range(1,27):
            if 27-int(j) not in n.values() and i not in n.keys():
                n[i]=27-int(j)
                m=m+int(n[i])*int(y[i])
    
    return m 

while 1:
    try:
        n=int(input())
        for i in range(n):
            x=input()
            a=piaoliangdu(x)
            print(a)
    except:break
            
            
            
            
            
            
            
            

发表于 2022-09-06 22:09:45 回复(0)
from collections import Counter

n = int(input())
li = []
for i in range(n):
    li.append(input())
# print(li)
for j in li:
    l = sorted(Counter(j).items(), key=lambda x: x[1], reverse=True)
#     print(l)
    pld = 26
    sum_pld = 0
    for (k, v) in l:
        sum_pld += v*pld
        pld -= 1
    print(sum_pld)
发表于 2022-08-25 16:53:27 回复(0)
def pls(s): # 定义计算漂亮度的函数
    counts = [] # 保存每个字母出现的次数
    scores = 0 # 漂亮度的总分
    for i in set(s):
        counts.append(s.count(i)) # 计算每个字母出现的次数
    counts.sort(reverse=True) # 将字母出现的次数倒序排列
    for i in range(len(counts)):
        scores += counts[i] * (26-i) # 按照字母出现的次数由高到低计算其分数并且加到总分,如出现次数最多的就乘以26,第二多的乘以25,以此类推,算出来的漂亮度就是最高的
    return scores # 返回总漂亮度

while True:
    try:
        n = int(input())
        ls = []
        for i in range(n):
            d = input().lower()
            ls.append(d) # 保存我们输入的字符串
        for i in ls:
            print(pls(i)) # 每个字符串都调一遍漂亮度函数,得到对应的漂亮度
    except:
        break
发表于 2022-08-21 17:21:00 回复(0)
while True:
    try:        
        def fun(str):
            str1=set(str)
            n=[]
            for i in str1:
                n.append(str.count(i))
            n.sort()
            n=n[::-1]
            m=[i for i in range(1,27)]
            m=m[::-1]
            m=m[:len(n)]
            y=0
            for i in range(len(n)):
                u=n[i]*m[i]
                y+=u
            return y
        # b=list(map(lambda x,y:x*y,n,m))
        # print(sum(b))
        str=int(input())
        h=[]
        for i in range(str):
            g=input()
            h.append(g)
        for i in h:
            print(fun(i))
    except:
        break
发表于 2022-08-18 21:35:33 回复(0)
str1=int(input())
i=0
a=[]
while i<str1:
    a.append(input())
    i=i+1

b=len(a)
c=dict()
d=[]
for i in range(b):
    e=dict()
    for j in a[i]:
        e[j]=a[i].count(j)
    d.append(e)  
#print(d)
f=[[k for k in d[i].values()]for i in range(len(d))]
for i in f:
    i.sort(reverse=True)
#print(f)
for i in range(len(f)):
    z=26
    sum=0
    for j in f[i]:
        unit=j*z
        z=z-1
        sum=sum+unit
    print(sum)   











发表于 2022-08-17 14:23:56 回复(0)
n = int(input())
def tanxin(s):
    d={}
    for i in s:
        if i not in d:
            d[i]=1
        else:
            d[i]+=1
    k=d.items()
    k=sorted(k,key= lambda x : x[1],reverse=True)
    f=26
    s=0
    for i in k:
        s=s+i[1]*f
        f=f-1
    print(s)
for i in range(n):
    n = input()
    tanxin(n)
发表于 2022-08-10 18:37:35 回复(0)
ip = int(input())
dic = {}

def getMaxPerfetScore(name):
    tmpDic = {}
    for char in name:
        if char in tmpDic.keys():
            tmpDic[char] += 1
        else:
            tmpDic[char] = 1
    sortedList = sorted(tmpDic.values(), reverse = True)
    score = 0    
    maxPoint = 26
    for item in sortedList:
        score += item*maxPoint
        maxPoint -= 1
    return score


for i in range(ip):
    name = input()
    dic[name] = getMaxPerfetScore(name)
    
for key,value in dic.items():
    print(value)
    
    

发表于 2022-08-05 14:22:50 回复(0)
from collections import Counter
while True:
    try:
        beauty = 0
        num = int(input())
        for i in range(num):
            strs = input().strip()
            strs_len = len(strs)
            dic = Counter(strs).most_common(strs_len)
            for j in range(len(dic)):
                beauty += (26-j)*dic[j][1]
            print(beauty)
            beauty = 0
    except:
        break

发表于 2022-07-29 19:31:36 回复(0)