完美字符串

约翰认为字符串的完美度等于它里面所有字母的完美度之和。每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数。

约翰不在乎字母大小写。(也就是说字母F和f)的完美度相同。给定一个字符串,输出它的最大可能的完美度。例如:dad,你可以将26分配给d,25分配给a,这样整个字符串完美度为77。

分析: 由排序不等式,出现次数最多的字母显然应该给26。所以这个题目变成了统计每种字母出现的次数了,然后按照出现次数从大到小,依次分配从高到低的权值。这就是最朴素的贪心思想。

输入

输入一个字符串S(S的长度 <= 10000),S中没有除字母外的其他字符。
输出
 
由你将1-26分配给不同的字母,使得字符串S的完美度最大,输出这个完美度。
 
输入示例

dad

输出示例

77
 1 /*********************************
 2 *   日期:2013-11-03
 3 *   作者:SJF0115
 4 *   题号: 题目 字符串的完美度
 5 *   来源:http://hero.pongo.cn/Question/Details?ID=71&ExamID=69
 6 *   结果:AC
 7 *   来源:庞果网
 8 *   总结:
 9 **********************************/
10 #include<iostream>
11 #include<stdio.h>
12 #include<string>
13 using namespace std;
14 
15 int cmp(const void*a, const void*b)
16 {
17     return *(int*)b - *(int*)a;
18 }
19 
20 int perfect(const string &s) {
21     int i;
22     int len = s.size();
23     int count[26] = { 0 };
24     //统计字母个数
25     for (i = 0;i < len;i++) {
26         if (s[i] >= 'A' && s[i] <= 'Z') {
27             count[s[i] - 'A'] ++;
28         }
29         else if (s[i] >= 'a' && s[i] <= 'z') {
30             count[s[i] - 'a'] ++;
31         }
32     }
33     //从大到小排序
34     qsort(count, 26, sizeof(count[0]), cmp);
35     int perfectDegree = 26;
36     int sum = 0;
37     //计算完美度
38     for (i = 0;i < 26;i++) {
39         sum += count[i] * perfectDegree;
40         perfectDegree--;
41     }
42     return sum;
43 }
44 
45 int main()
46 {
47     int i, n;
48     string str;
49     while (cin >> str) {
50         printf("%d
", perfect(str));
51     }
52     return 0;
53 }
不犯罪盗版→提高自我技术
原文地址:https://www.cnblogs.com/zoudajia/p/5508494.html