每个测试文件均包含多组测试数据。第一行输入一个整数
代表数据组数,每组测试数据描述如下:
在一行上输入一个长度为
、仅由小写字母构成的字符串
。
对于每一组测试数据,输出一个整数,表示字符串的最大“漂亮度”。
2 zhangsan lisi
192 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; }
#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; }
#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; }
#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; }
#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; }
#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; }
#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; }
#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; }
#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); } }
#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; }
#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; }