/* 本文系「人工智能安全」(微信公众号)原创,转载请联系本文作者(同博客作者)。 欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。 我是一名有诗人气质的网络安全工程师 期待与你的思想交流碰撞出智慧的花火 作者:水木清华 2020-05-07 名字的漂亮度 */ /* 解题思路:笨方法——用「钱」式思维来思考 名字的漂亮度,其实就是比谁的名字更值钱! 我们将名字的字母对应的「数字」作为它的价钱, 比如 26 最高,1 则最低,按大小顺序排布。 那么,我们要得到名字的最大可能「漂亮度」, 就要使得,越高频出现的字母,价钱越高。 Better than OK? 来!我们一起开始写代码! */ #include <iostream> #include <algorithm> using namespace std; //计算名字的最大可能漂亮度(最高价钱)的函数接口 int MostValuableName (string Name) { int Alphabet[26] = {0}; //初始化一个数组,用于记录名字中不同字母出现的次数 int Price[26] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26}; //初始化一个价钱表 int MostValuable = 0; //初始化名字的最高价钱 for (int i = 0; i < Name.size(); i++) { //大写字母的情况 if (Name[i] >= 'A' && Name[i] <= 'Z') { Alphabet[Name[i] - 'A'] += 1; //累加字母的出现次数 } //小写字母的情况 else if (Name[i] >= 'a' && Name[i] <= 'z') { Alphabet[Name[i] - 'a'] += 1; //累加字母的出现次数 } } sort(Alphabet, Alphabet + 26); for (int i = 0; i < 26; i++) { MostValuable += Alphabet[i] * Price[i]; //依次取高频字母,对应地,依次取高价钱; //正所谓「好货不便宜,便宜无好货」,哦,好像不对, //应该是卖得越多的货的价钱越高,就越赚钱!!! } return MostValuable; //返回一个名字的最大可能价钱(即漂亮度) } //计算多个名字的最大可能漂亮度(最高价钱)的函数接口 int MaximumPriceOfName (int Number) { string Name; //字符串形式的名字 for (int i = 0; i < Number; i++) { cin >> Name; //输入名字 cout << MostValuableName (Name) << endl; //输出名字的最大可能漂亮度 } return 0; } //主函数 int main () { int N; //需要计算最大可能漂亮的名字个数 while (cin >> N) { MaximumPriceOfName (N); //输出多个名字的最大可能漂亮度 } return 0; }