首页 > 试题广场 >

名字的漂亮度

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

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

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

本题含有多组数据。

数据范围:输入的名字长度满足



输入描述:

第一行一个整数N,接下来N行每行一个字符串



输出描述:

每个字符串可能的最大漂亮程度

示例1

输入

2
zhangsan
lisi

输出

192
101

说明

对于样例lisi,让i的漂亮度为26,l的漂亮度为25,s的漂亮度为24,lisi的漂亮度为25+26+24+26=101.   
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compareFunc(const void *a,const void *b)
{
    return *(int*)a < *(int*)b;
}

int main() {
    int line;

    scanf("%d", &line);

    while (line--) {
        char str[10024] = {0};
        int arr[26] = {0};

        scanf("%s", str);
        int len = strlen(str);
        for(int i=0;i<len;i++){
            arr[str[i] - 'a'] ++;
        }

        qsort(arr, 26, sizeof(int), compareFunc);

        int sum = 0;
        for(int i=0;i<26;i++){
            sum += (26 - i)*arr[i];
        }
        printf("%d\n", sum);
    }

    return 0;
}

发表于 2024-02-23 09:35:37 回复(0)
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define N 10001

void swap(int num[], int a, int b)
{
    int temp = num[a];
    num[a] = num[b];
    num[b] = temp;
}

int main()
{
    int n;
    scanf("%d", &n);
    char s[N] = {0};
    for(int i = 0; i < n; i++){
        scanf("%s", s);
        int len = strlen(s);
        int num['z'+1] = {0};
        int totatl = 0, rate = 26;
        for(int j = 0; j < len; j++){
            num[s[j]]++;
        }
        // 利用冒泡排序法对num进行排序
        for(int j = 'a'; j < 'z'; j++){
            for(int k = j+1; k <= 'z'; k++){
                if(num[k] > num[j]) swap(num, j, k);
            }
        }
        for(int j = 'a'; j <= 'z'; j++){
            totatl += (num[j] * rate);
            rate--;
        }
        printf("%d\n", totatl);
    }
    return 0;
}

发表于 2023-11-21 22:12:08 回复(0)
#include <stdio.h>
int main() {
    int n; 
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        char str[10000]={'\0'};
        int max=0;
        int score=0;
        int a=26;
        int count[26]={0};
        scanf("%s",str);
        for(int j=0;j<strlen(str);j++)
        {
            count[str[j]-'a']++;
            if(max<count[str[j]-'a'])
            max=count[str[j]-'a'];
        }     
        while(max)
        {
            for(int j=0;j<26;j++)
            {
                if(count[j]==max)
                {
                    score+=a*max;
                    a--;
                }
            }    
            max--; 
        }
        printf("%d\n",score);
    }
    return 0;
}

发表于 2023-11-07 23:38:02 回复(0)
#include <stdio.h>
#include <string.h>

void BubbleSort(int arr[],int n)
{
    for(int i = 0;i<n-1;i++)
    {
        for(int j = 0;j<n-1-i;j++)
        {
            if(arr[j]-arr[j+1]<0)
            {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}

int main() {
    int n = 0;
    scanf("%d",&n);
    char str[10001] = {'\0'};
    while (n--) {
        scanf("%s", str);
        int len = strlen(str);
        int arr[26] = {0};
        for(int i = 0;i<len;i++)
        {
            arr[str[i]-'a']++;
        }
        BubbleSort(arr,26);
        int ret = 0;
        int max = 26;
        for(int i = 0;i<26;i++)
        {
            ret += arr[i]*max;
            max--;
        }
        printf("%d\n",ret);
    }
    return 0;
}
发表于 2023-10-18 11:31:19 回复(0)
#include <stdio.h>
#include <string.h>

int f(char *a , int n){
    int num[26]={0};
    for(int i=0 ;i<n ;i++) {
        if(a[i]>='A'&&a[i]<='Z')  a[i]+='a'-'A';
        num[a[i]-'a']++;
    }
    for(int i=0 ; i<26 ;i++){
        int max=num[i],maxj=i;
        for(int j=i+1 ; j<26 ; j++){
            if(max<num[j])  max=num[j],maxj=j;
        }
        num[maxj]=num[i];
        num[i]=max;
    }
    int sum=0;
    for(int i=0;num[i]!=0 ;i++) sum+=num[i]*(26-i);
    return sum;
}

int main() {
    int n;
    char a[10001];
    scanf("%d",&n);
    for(int i=0 ;i<n ;i++ ){
        scanf("%s",a);
        printf("%d\n",f(a,strlen(a)));
    }
    return 0;
}

发表于 2023-04-23 11:50:11 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a, const void *b){
    return (*(int *)a) < (*(int *)b);
}
int main() {
    int n;
    char str[10001];  
    int key[26] = {0};
    int value = 26;
    for (int i = 0; i < 26; i++){
        key[i] = value--;
    }
    scanf("%d", &n);

    while (scanf("%s", str) != EOF) {
        int max = 0;
        int word[26] = {0};
        for (int i = 0; i < strlen(str); i++){
            word[str[i] - 'a']++;
        }
        qsort(word, 26, sizeof(int), cmp);

        for (int i = 0; i < 26; i++){
            max = key[i] * word[i] + max;

        }
        printf("%d\n", max);

    }
    return 0;
}
发表于 2023-04-11 11:31:49 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    int n;
    char str[10000] = {};
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%s", str);

        int len = strlen(str);
        int hash[26] = {0};
        for (int j = 0; j < len; j++) {  //记录字母出现的次数
            hash[str[j] - 'a']++;
        }

        //排序
        for (int j = 0; j < 25; j++) {
            for (int k = 0; k < 25 - j; k++) {
                if (hash[k] < hash[k + 1]) {
                    int temp = hash[k];
                    hash[k] = hash[k + 1];
                    hash[k + 1] = temp;
                }
            }
        }

        //输出
        int sum = 0;
        int add = 26;
        for (int j = 0; j < 26; j++) {
            if (hash[j] != 0) {
                sum += hash[j] * add;
                add--;
            }
        }
        printf("%d\n", sum);

    }
    return 0;
}

发表于 2023-02-28 19:55:52 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    int a;
    scanf("%d",&a);
    char b[1000][10000];

    for(int i=0;i<a;i++)//定义数组
    {
        char asc[26]={0};
        scanf("%s",&b[a][0]);
        int d=strlen(b[a]);
        for(int j=0;j<d;j++)
        {
            int c;
            c=b[a][j]-'a'+1;
            asc[c]++;
        }//用小字母的asc值保存各字母出现次数
        for(int k=1;k<=26-1;k++)
        {
            for(int l=k+1;l<=26;l++)
            {
                if(asc[l]<asc[k])
                {
                    int max;
                    max =asc[k];
                    asc[k]=asc[l];
                    asc[l]=max;
                }
            }
        }
        int nice;
        int goal=0;
        for(int i=26;i>0;i--)
        {
            goal+=i*asc[i];
            asc[i]=0;
        }
        printf("%d\n",goal);
    }
    return 0;
}

为什么会有两组用例通不过呢,也没有到最大值
发表于 2023-01-31 22:25:37 回复(0)
#include<stdio.h>
#include<string.h>
int main()
{
    int n = 0;
    int same[10000] = {0};
	int result[1000] = {0};
    int k = 0;
    char str[10000] = {0};
    scanf("%d",&n);
    for(int a = 0;a < n;a++)
	{
        scanf(" %s",str);
		memset(same,0,sizeof(same));
		//统计各字母数
		for(int i = 0;i < 26;i++)
		{
			for(int j = 0;j < strlen(str);j++)
				if(str[j] == 'a' + i)
					same[i]++;
		}
		//排序
		for(int i = 0;i < 26;i++)
		{
			for(int j = 0;j < 25;j++)
			{
				if(same[j] < same[j+1])
				{
					int temp = 0;
					temp = same[j];
					same[j] = same[j+1];
					same[j+1] = temp;
				}
			}
		}
		//计算
		int j = 0;
		for(int i = 26;i >= 1;i--)
		{
			result[k] = result[k]+same[j++]*i;
		}
			k++;
	}
	for(int i = 0;i < n;i++)
		printf("%d\n",result[i]);
    return 0;
}

发表于 2022-07-27 23:24:17 回复(0)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int compar(void *a,void *b)
{
    int *a_t = (int *)a;
    int *b_t = (int *)b;
    return (*b_t-*a_t);
}
int main(void)
{
    char *name[1000];
    int N;
    int len = 0;
    int beaty_level = 26,name_beaty[1000]={0};
    int map[128] = {0},i =0,j = 0;
    char *tmp = NULL;
    while(scanf("%d",&N)!=EOF){
        for(i = 0;i<N;i++)
        {
            name[i] = malloc(sizeof(char)*10000);
            if(!name[i])
            {
                return -1;
            }
            scanf("%s",name[i]);
        }
        for(i = 0;i<N;i++)
        {
            memset(map,0,sizeof(map));
            beaty_level = 26;
            tmp = name[i];
            len = strlen(tmp);
            for(j=0;j<len;j++)
            {
                map[tmp[j]]++;
            }
            qsort(map, 128, sizeof(int), (__compar_fn_t)compar);
            for(j = 0;j<26;j++)
            {
                name_beaty[i] +=(beaty_level*map[j]);
                beaty_level--;
            }
            free(name[i]);
            name[i] = NULL;
        }
        for(i = 0;i<N;i++)
        {
            printf("%d\n",name_beaty[i]);
        }
    }   
    return 0;
}

发表于 2022-06-22 00:03:32 回复(0)
#include <stdio.h>
#define     M    100
#define     N    10000
int main()
{
    char str[M][N];
    int n,i,j,k,max,arr[26]={0},beauty_sum[M]={0},beauty;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<n;i++)
            scanf("%s",str[i]);
        for(i=0;i<n;i++)
        {
            j=0;beauty=26;
            while(str[i][j]!='\0')
            {
                arr[str[i][j]-'a']++;
                j++;
            }
            for(j=0;j<26;j++)
            {
                max=0;
                for(k=1;k<26;k++)
                    if(arr[max]<arr[k])
                        max=k;
                if(arr[max]>0)
                {
                    beauty_sum[i]+=(beauty--)*arr[max];
                    arr[max]=0;
                }
            }
        }
        for(i=0;i<n;i++)
            printf("%d\n",beauty_sum[i]);
    }
    return 0;
}

发表于 2022-04-28 17:36:40 回复(0)
/****** 利用数组下标 排序+去重 ******/
#include <stdio.h>
#include <string.h>
char s[1001];
int main(void)
{
    int num;
    scanf("%d", &num);
    for (int i = 0; i < num; i++) {
        int sum_num = 0;
        int s_temp[150] = {0};
        scanf("%s", s);
        int s_len = strlen(s);
        for (int j = 0; j < s_len; j++) {
            s_temp[s[j]]++; // 使用下标去重复,并计算相同字母个数
        }
        int x = 1001; // 权重由大到小筛查
        int qz_num = 26; // 初始化最大权重
        while (--x) {
            for (int k = 'A'; k <= 'z'; k++) {
                if (s_temp[k] == x) { // 查到当前为止最大权重的字母
                    sum_num += qz_num * x; // 计算总重
                    qz_num--; // 权重递减
                }
            }
        }
        printf("%d\n", sum_num);
    }
    return 0;
}

发表于 2022-04-23 20:48:14 回复(0)
#include<stdio.h>
#include<string.h>
int main()
{
    int N;
    scanf("%d",&N);
    //循环输入字符串
    for(int i=0;i<N;i++)
    {
        char str[10000]={0};
        scanf("%s",str);
        int len=strlen(str);
        int number[26]={0};
        int i,j;
        //将字符串中的小写字母映射到number数组中记录出现次数
        for(i=0;i<len;i++)
        {
            number[str[i]-97]++;
        }
        //冒泡排序将number数组从小到大排序
        for(i=0;i<26;i++)
        {
            for(j=0;j<26-i-1;j++)
            {
                if(number[j]>number[j+1])
                {
                    int temp=number[j+1];
                    number[j+1]=number[j];
                    number[j]=temp;
                }
            }
        }
        //对number数组进行乘积累加
        int sum=0;
        for(i=0;i<26;i++)
        {
            sum+=number[i]*(i+1);
        }
        printf("%d\n",sum);
    }
    return 0;
}

发表于 2022-03-19 12:16:03 回复(0)
#include <stdio.h>

int main()
{
    int n, i, j, k;
    int buff;
    unsigned char name[10000];
    unsigned char* p;
    unsigned char map[27];
    unsigned char tmp;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%s",name);
        memset(map,'\0',27);
        for(p=name;*p!='\0';p++)
        {
            *p=tolower(*p);
            map[(*p-'a')]++;
            
        }
        for(j=0;j<26;j++)
            for(k=j+1;k<26;k++)
            {
                if(map[j]<map[k])
                {
                    tmp=map[j];
                    map[j]=map[k];
                    map[k]=tmp;
                }
            }
        for(j=26,buff=0;map[26-j]!=0;j--)
        {
            buff+=j*(int)(map[26-j]);
        }
        
        printf("%d\n",buff);
    }
    
}

发表于 2022-03-01 16:06:09 回复(0)
4/11 组用例通过
有些数据会出问题,大家帮忙看看哪里不对
#include "stdio.h"

int main()
{
    int num,x=0;
    scanf("%d",&num);
    char str[num][10001];
    
    for(int i=0;i<num;i++)
    {
        scanf("%s",str[i]);
    }
    
    for(int i=0;i<num;i++)
    {
        int cnt[26]={0};
        int len = strlen(str);
        for(int j=0;j<len;j++)
        {
            /*****计算各字母数量****/
            if(str[i][j]>='A' && str[i][j]<='Z')
                cnt[str[i][j]-'A']++;
            else if(str[i][j]>='a' && str[i][j]<='z')
                cnt[str[i][j]-'a']++;
        }
        
        //按照数量降序排列
        int buf;
        for(int i=0;i<26-1;i++)
        {
            for(int j=0;j<26-1-i;j++)
            {
                if(cnt[j]<cnt[j+1])
                {
                    buf=cnt[j];
                    cnt[j]=cnt[j+1];
                    cnt[j+1]=buf;
                }
            }
        }
        
        /*****计算漂亮度******/
        int piaoliang=26;
        int piaoliangdu=0;
        for(int i=0;i<26;i++)
        {
            piaoliangdu += cnt[i]*piaoliang;
            piaoliang--;
        }
        printf("%d\n",piaoliangdu);
    }
    
    return 0;
}


发表于 2022-02-12 16:31:05 回复(2)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	int n,i,s,j,sum=0;
	char a[10002];
	int b[26] = { 0 };
	scanf("%d", &n);
	while (n--)
	{
		scanf("%s", &a);
		s = strlen(a);
		for (i = 0; i < s; i++)
		{
			if (a[i] >= 'A' && a[i] <= 'Z')
				a[i] = a[i] + 32;

			b[a[i] - 'a']++;

		}
		int k = 26;
		for (i = 0; i < 26; i++)
		{
			for(j=0;j<25;j++)
			if (b[j] < b[j + 1])
			{
				int temp = b[j];
				b[j] = b[j + 1];
				b[j + 1] = temp;
			}
		

		}
		for (i = 0; i < 26; i++)
		{
			if (b[i] != 0)
			{
				sum = sum + b[i] * k;
				k--;
			}
			else
				break;

		}
		printf("%d\n", sum);
		sum = 0;
		memset(a, 0, sizeof(a));
		memset(b, 0, sizeof(b));

	}



	return 0;
}


发表于 2022-02-02 10:10:56 回复(0)
结构体,  qsort根据出现次数从高到低排序,之后赋值漂亮度。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct
{
    char alpha;
    int num;
    int weight;
}test;

int cmp(const void *a,const void *b)
{
    return  (*(test*)b).num-(*(test*)a).num;
}

int main()
{
    int num;
    scanf("%d",&num);
    for(int i=0;i<num;i++)
    {
        test input[26];
        for(int i=0;i<26;i++)
        {
            input[i].alpha='a'+i;
            input[i].num=0;
            input[i].weight=0;
        }
        char str[10000]={0};
        scanf("%s",str);
        int sum=0;
        int len=strlen(str);
        for(int j=0;j<len;j++)
        {
            for(int k=0;k<26;k++)
            {
                if(str[j]=='a'+k)
                {
                    input[k].num++;
                }
            }
        }
        qsort(input,26,sizeof(test),cmp);
        for(int j=0;j<26;j++)
        {
            input[j].weight=26-j;
        }
        for(int j=0;j<len;j++)
        {
            for(int k=0;k<26;k++)
            {
                if(str[j]==input[k].alpha)
                {
                    sum=sum+input[k].weight;
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

发表于 2021-12-20 22:20:50 回复(0)

问题信息

难度:
24条回答 37507浏览

热门推荐

通过挑战的用户

查看代码