首页 > 试题广场 > 名字的漂亮度
[编程题]名字的漂亮度
  • 热度指数:63654 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。

给出多个名字,计算每个名字最大可能的“漂亮度”。

本题含有多组数据。



输入描述:

整数N,后续N个名字



输出描述:

每个名称可能的最大漂亮程度

示例1

输入

2
zhangsan
lisi

输出

192
101
#include <iostream>
using namespace std;

int main()
{
	int test;
	while (cin >> test)
	{
		while (test--)
		{
			string st;
			cin >> st;
			int i, a[26] = {0}, k = 26, res = 0;
			for (i = 0; i < st.length(); ++i)
			{
				if (st[i] >= 'a' && st[i] <= 'z')
					a[st[i] - 'a']++;
				else
					a[st[i] - 'A']++;
			}
			sort(a, a + 26);
			for (i = 25; i >= 0; --i)
				res += a[i] * k--;
			cout << res << endl;
		}
	}
	return 0;
}

发表于 2016-07-09 14:23:24 回复(19)
import java.util.*;
 
public class Main{
    public static void main(String[] args){
 		Scanner scan = new Scanner(System.in);
        while(scan.hasNext()){
            int N = scan.nextInt();
            String[] str = new String[N];
            for(int i=0;i<N;i++){
                str[i] = scan.next();
            }

            for(int i=0;i<N;i++){
                int[] count = new int[26];
                int len = str[i].length();
                for(int j=0;j<len;j++){
                    int ascii = str[i].charAt(j);
                    //System.out.println("ascii="+ascii);
                    if(ascii>='a'&& ascii<='z'){
                        count[ascii-97]++;
                    }else if(ascii>='A'&& ascii<='Z'){
                        count[ascii-65]++;
                    }
                }
                Arrays.sort(count);
                int piaoliangdu = 0;
                for(int k =0;k<26;k++){
                    piaoliangdu+=count[k]*(k+1);
                }
                System.out.println(piaoliangdu);
            }
        }
        scan.close();
    }
}

发表于 2016-04-07 19:32:42 回复(6)

这道题使用Counter模块来做非常适合,将字母出现的顺序递减排列,分别乘以26、25、24……就可以得到结果

from collections import Counter
while True:
    try:
        a=int(input())
        for i in range(a):
            c,start,res=Counter(input()),26,0
            for j in c.most_common():
                res+=j[1]*start
                start-=1
            print(res)

    except:
        break
发表于 2017-10-04 20:02:38 回复(11)
# str转换成list
def str2list(s):
    l=[v for v in s]
    return l

def beautiful_degree(s):
    l=str2list(s)#['l','i','s','i']
    ans=0
    dic={}
    for i in l:
        if i in dic:
            dic[i]+=1
        else:
            dic[i]=1
    # dic={'l':1,'i':2,'s':1}
    lst=sorted(dic.items(), key=lambda x: x[1], reverse=True)  # 按字典的value排序(倒序)
    # lst=[(i,2),(s,1),(l,1)]
    abc = [k for k in range(26, 0, -1)]#[26,25,24....]
    for j in range(len(lst)):
        ans += lst[j][1]*abc[j]
    return ans


while True:
    try:
        n=int(input())# 多少个名字
        li=[]
        for i in range(n):
            name=input()
            li.append(name)
        #li=['zhangsan','lisi']
        for j in range(len(li)):
            print(beautiful_degree(li[j]))
    except:
        break
很多人题意看不明白,其实就是出现次数最多的字母漂亮度是26,第二多的是25...以此类推。最后累计加和,这样整个单词的漂亮度最高,附代码。
发表于 2020-02-17 15:50:49 回复(6)
//朋友们这就是一个大根堆的问题啊,统计字母个数存在大根堆,然后ans += top*(26-i);
#include<iostream>
#include<string>
#include<queue>
using namespace std;

string nameBeauty[1001];
int aphaCout(string& rhs);
int main(){
	int _N;
	while(cin>>_N){
		for(int i=0;i<_N;i++){
			cin>>nameBeauty[i];
		}
        for(int i=0;i<_N;i++){
            cout<<aphaCout(nameBeauty[i])<<endl;
        }
	}
    return 0;
}
int aphaCout(string& rhs){
	priority_queue<int> mypq;
	int aph[26] = {0};
	int ans = 0;
	for(int i=0;i<rhs.size();i++){
		++aph[rhs[i]-'a'];
	}
	for(int i=0;i<26;i++){
		if(aph[i] != 0 ){
			mypq.push(aph[i]);
		}
	}
	int _size = mypq.size();
	for(int i=0;i<_size;i++){
		ans += (26-i) * mypq.top();
		mypq.pop();
	}
	return ans;
}

发表于 2017-06-26 16:40:11 回复(0)
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>

using namespace std;
int you_beautiful_name(string str){
	int beauty = 0, cnt[26] = {}, score = 26;
	vector<int> nums;
	for (auto &c : str)
		++cnt[tolower(c) - 'a'];
	for (auto i : cnt)
	if (cnt != 0) nums.push_back(i);
	sort(nums.begin(), nums.end());
	for (unsigned int i = 1; i <= nums.size(); ++i)
		beauty += ((score--)*nums[nums.size() - i]);
	return beauty;
}

int main(){
	int num = 0;
	string str;
	while (cin >> num){
		for (int i = 0; i<num; ++i){
			cin >> str;
			cout << you_beautiful_name(str) << endl;
		}
	}
	return 0;
}

发表于 2017-06-05 20:28:31 回复(1)
#include <bits/stdc++.h>
using namespace std;
int count(string str){
    int result = 0;
    map<char,int> helper;
    for(auto ch:str) ++helper[ch];
    vector<pair<char,int> > vec(helper.begin(),helper.end());
    stable_sort(vec.begin(), vec.end(),
               [](const pair<char,int>& p1, const pair<char,int>& p2)
                {return p1.second > p2.second;});
    for(int i=0;i < vec.size();i++)
        result += (26-i)*vec[i].second;
    return result;
}
int main(){
    int n;string name;
    while(cin >> n)
        for(int i=0;i < n;++i){
            cin >> name;
            cout << count(name) << endl;
        }
    return 0;
}

发表于 2020-06-22 22:18:58 回复(1)
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <string>
using namespace std;

bool isBigger(const pair<int, int> &lhs, const pair<int, int> &rhs) {
	return lhs.second > rhs.second;
}


int main()
{
	int test;
	while (cin >> test)
	{
		while (test--)
		{
			string st;
			cin >> st;
			int i, k = 26, res = 0;
			map<int, int> m;
			for (i = 0; i < st.length(); ++i)
			{
				if (st[i] >= 'a' && st[i] <= 'z')
					m[st[i] - 'a']++;
				else
					m[st[i] - 'A']++;
			}
			vector<pair<int, int> > pvec(m.begin(), m.end());
			sort(pvec.begin(), pvec.end(), isBigger);
			//int size = pvec.size();
			for (i = 0; i <= pvec.size() - 1; i++)
				res += pvec[i].second * k--;
			cout << res << endl;
		}
	}
	return 0;
}

编辑于 2019-09-16 15:29:18 回复(0)
//#include "stdafx.h"
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<vector>
using namespace std;
struct Map
{
   char key;
   int value;
};
bool compare(Map a,Map b)
{
  return a.value>b.value;
};
int main()
{
   string str;
   int score=0;
   int n;
   cin>>n;
   for(int i=0;i<n;i++)
   {
 cin>>str;
 score=0;
 map<char,int>moban;
 map<char,int>::iterator iter;
  for(int i=0;i<str.size();i++)
  {
 moban[str[i]]++;
  }
       
  vector<Map>result;
  for(iter=moban.begin();iter!=moban.end();iter++)
  {
 Map aa;
       aa.key=iter->first;
 aa.value=iter->second;
 result.push_back(aa);
  }
  sort(result.begin(),result.end(),compare);
  int ii=26;
  for(int k=0;k<result.size();k++)
  {
  score+=result[k].value*ii;
      ii--;
  }
  cout<<score<<endl;
   }
   return 0;
}


发表于 2016-06-25 11:18:19 回复(1)
大佬们帮忙看一下为啥OJ过不了,本地结果都对。OJ输出是空    本地输出正确数据
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string str;
    int N;
    cin>>N;
    while(N--)
    {
        cin>>str;
        int arr[26] = {0};
        int res = 0;
        int count = 0;
        for(int i =0;i<str.size();i++)
        {
            if(str[i]>='a'&&str[i]<='z')
            {
              arr[str[i]-'a']+= 1;  
            }
            else if (str[i]>='A'&&str[i]<='Z')
            {
              arr[str[i]-'A']+= 1;
            }
        }
        //冒泡排序
        for(int j = 0;j< 26;j++)
        {
            for(int k = j+1;k<26;k++)
            {
                int tmp = 0;
                if(arr[j]<arr[k])
                {
                    tmp = arr[j];
                    arr[j] = arr[k];
                    arr[k] = tmp;
                }
            }
        }
        
        for(int n = 0;n<26;n++)
        {
            if(arr[n] != 0)
            {
                res+= arr[n]*(26-count);
                count++;
            }
        }
        cout<<res<<endl;
    }
    return 0;
}

发表于 2021-01-12 22:22:44 回复(1)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int num = scanner.nextInt();
            for (int i = 0; i < num; i++){
                int value = 26;
                int totalBeauty = 0;
                List<String> list = Arrays.asList(scanner.next().split(""));
                Map<String, Integer> alpFreq = new HashMap<>();
                for (int j = 0; j < list.size(); j++){
                    if (alpFreq.containsKey(list.get(j).toLowerCase())){
                        alpFreq.put(list.get(j).toLowerCase(),alpFreq.get(list.get(j).toLowerCase())+1);
                    }else{
                        alpFreq.put(list.get(j).toLowerCase(),1);
                    }
                }
                List<Map.Entry<String, Integer>> sortedList = new ArrayList<>(alpFreq.entrySet());
                Collections.sort(sortedList, new Comparator<Map.Entry<String, Integer>>(){
                    public int compare(Map.Entry<String, Integer> entry1, Map.Entry<String, Integer> entry2){
                        return entry2.getValue() - entry1.getValue();
                    }
                });
                Iterator<Map.Entry<String, Integer>> iter = sortedList.iterator();
                while (iter.hasNext()){
                    totalBeauty += alpFreq.get(iter.next().getKey())*value;
                    value -= 1;
                }
                System.out.println(totalBeauty);
            }
        }
    }
}


编辑于 2021-01-05 14:15:15 回复(0)
出现最多的字母的漂亮度为26,第二多的为25,以此类推

#include <stdio.h>
#include <string.h>
#include <ctype.h>


int cmp(const void*a,const void*b)
{
return *(int*)b-*(int*)a; //大到小
}

int func (char *a)
{
    int len=strlen(a);
    int an[30]={0},t=0;
    for (int i=0;i<len;i++)
    {
        if (isupper(a[i])) a[i]=a[i]+32;
    }
    
    for (int i=0;i<len;i++)
    {
        int k=a[i]-'a';
        an[k]++;
    }
    qsort(an,26,sizeof(int),cmp);
    for (int i=0;i<26;i++) t=t+an[i]*(26-i);
    return t;
}


int main ()
{
    int num;
    while (scanf("%d",&num)!=EOF)
    {
        int bn[1000]={0};
        char str[3000] = {0}; 
        for(int i=0; i<num; i++) 
        {
          scanf("%s",str);  
          bn[i]=func(str);         
        }
        for (int i=0; i<num; i++) 
            printf("%d\r\n",bn[i]);
    }
}


发表于 2020-09-28 17:45:30 回复(0)
把题目读清楚基本没什么问题
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
    using namespace std;
    string st;
  //  int s[26] = {0};
    int n,i;
    while(cin >> n) 
    {
      while(n)
      {
        int s[26] = {0};
        int k = 26,beauty = 0;
        cin >> st;
        for(i=0;i<st.size();i++)
        {
            if(st[i]>='A'&&st[i]<='Z')
                s[st[i]-'A']++;
            else 
                s[st[i]-'a']++;
        }
        sort(s,s+26);
        for(i=25;i>=0;i--)
        {
            beauty += k*s[i];
            k--;
        }
        cout << beauty << endl;
        n--;
      }
    }
    return 0;
}

发表于 2020-08-20 15:52:44 回复(0)
根据大佬的代码 改了一下
原来是输入一个字母出来一个值  不能一起输入两个字母  然后一起输出两个值
改了之后就可以同时输入两个字母串 然后再输出两个值
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int jisuan(string str)
{
	int i, a[26] = { 0 }, k = 26, res = 0;
	for (i = 0; i < str.length(); ++i)
	{
		if (str[i] >= 'a' && str[i] <= 'z')
			a[str[i] - 'a']++;
		else
			a[str[i] - 'A']++;
	}
	sort(a, a + 26);
	for (i = 25; i >= 0; --i)
		res += a[i] * k--;
	return res;
}
int main()
{
	int test;
	string str[1000];
	while (cin >> test)
	{
		for (int i = 0;i < test;i++)
		{
			cin >> str[i];
		}
		for (int i = 0;i < test;i++)
		{
			cout << jisuan(str[i]) << endl;
		}
	}
	return 0;
}

编辑于 2020-07-17 18:22:50 回复(0)

用map统计每个字母出现的次数
再用multimap反转接收key,value
然后遍历multimap,total += (27-size)*m.first;

#include<map>
(747)#include<iostream>
#include<string>

using namespace std;

int main() {
    int num;
    while(cin >> num) {
        string str;
        while(num--) {
            cin >> str;
            map<char, int> imap;
            for(auto st : str) {
                imap[st]++;
            }
            multimap<int, char> tmap;
            for(auto m : imap) {
                tmap.insert(pair<int, char>(m.second, m.first));
            }
            int size = tmap.size();
            int total = 0;
            for(auto m : tmap) {
                total += (27-size)*m.first;
                size--;
            }
            cout << total << endl;
        }
    }

    return 0;
}
发表于 2020-02-22 22:04:12 回复(0)
while True:
  try:
    a = int(input())
    while a:
      b,c,d = input(),{},0
      # 去重存入字典
      for i in b:
        if i not in c:
          c[i] = 1
        else:
          c[i] += 1
      # 排序
      e = sorted(c.values(),reverse = True)
      pl = 26
      for i in e:
        d += i*pl
        pl -= 1
      print(d)
      a -= 1
  except:
    break

发表于 2020-02-20 10:57:17 回复(0)
//难度不大,但是数组的值的范围要设大一点,不然很多组输入会越界
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        char** a=new char*[n];//初始化输入数组
        for(int i=0;i<n;i++)
            a[i]=new char[3000];
        for(int i=0;i<n;i++)
            cin>>a[i];
        for(int i=0;i<n;i++){
            int help[26];
            for(int i=0;i<26;i++)//计数器归零
                help[i]=0;
            for(int j=0;j<strlen(a[i]);j++){//每个字符分别统计出现次数,不区分大小写
                if(a[i][j]>='a'&&a[i][j]<='z')
                    help[a[i][j]-'a']++;
                else if(a[i][j]>='A'&&a[i][j]<='Z')
                    help[a[i][j]-'A']++;
            }
            sort(help,help+26);//按出现顺序小到大排序
            int total=0;
            for(int i=25;i>=0;i--){//出现顺序大的应该权值大,由此算总值
                total+=help[i]*(i+1);
            }
            cout<<total<<endl;
        }
    }
}

发表于 2020-01-08 09:04:51 回复(0)
while True:
    try:
        times = int(input().strip())
        for i in range(times):
            name = input().strip()
            char_dict = {}
            for key in name:
                if key in char_dict.keys():
                    char_dict[key] += 1
                else:
                    char_dict[key] = 1
            value_list = []
            for key in char_dict.keys():
                value_list.append(char_dict[key])
            beauty_value = 26
            total_value = 0
            for num in sorted(value_list, reverse=True):
                total_value += beauty_value * num
                beauty_value -= 1
            print(total_value)

    except:
        break
找出每个字母,形成列表,按照出现的次数非升序排列。然后最大的给26权重,次之的给25权重,以此类推,直至遍历完列表,得出总漂亮值。
发表于 2019-11-14 20:56:56 回复(0)
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

void Beauty(string str) 
{
	int alpha[26] = {0};
	
	for (int i = 0; i < str.length(); i++) 
	{
		if (str[i] >= 'a' && str[i] <= 'z')
		{
			alpha[str[i] - 97] ++;
		}
		else if (str[i] >= 'A' && str[i] <= 'Z')
		{
			alpha[str[i] - 65] ++;
		}
	}
	sort(alpha, alpha+26);
	int sum = 0;
	for (int i = 26; i > 0; i--) 
	{
		sum += alpha[i-1] * i;
	}
	cout << sum << endl;
}

int main()
{
	int num;
	while (cin >> num)
	{
		while (num--)
		{
			string tmp;
			cin >> tmp;
			Beauty(tmp);
		}
	}
	return 0;
}


发表于 2019-09-10 20:14:39 回复(0)
while True:
    try:
        x=int(raw_input())
        ll=[]
        for i in range(x):
            ll.append(raw_input())
        for i in range(len(ll)):
            ls=list(ll[i])
            dd=set(ls)
            m=len(dd)
            mm=list(dd)
            ss=[]
            for i in range(m):
                ss.append(ls.count(mm[i]))
            ss.sort(reverse=True)
            summ=0
            k=26
            for i in range(m):
                summ=summ+ss[i]*k
                k=k-1
            print(summ)
    except:
        break

发表于 2019-07-23 20:09:45 回复(0)