题目
描述
给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。知识点
字符串运行时间限制
0M内存限制
0输入
整数N,后续N个名字
N个字符串,每个表示一个名字输出
每个名称可能的最大漂亮程度样例输入
2
zhangsan
lisi- 样例输出
192
101
思路
该题描述不太清楚,不是第一个字母为26,后面的不重复的减1,而是26*字母个数最多的+25*字母个数其次的+24*字母个数再其次的。
该题最开始需要去掉重复的,并且计算重复的次数,非常适合使用map结构。
map结构是按第一个进行索引排序的,而不是按第二个,所以需要将第二个,也就是重复字母的个数取出来,并进行排序,然后按公式求和,得到最终解。
#include <stdio.h>
#include <iostream>
#include <map>
#include <stdlib.h>
#include <algorithm>
using namespace std;
bool compare(int a,int b)
{
return a>b; //升序排列,如果改为return a>b,则为降序
}
int main()
{
int N;
char name[10005];
cin>>N;
char c = getchar();
while(N--)
{
gets(name);
map<char, int>charmap;
for(int i = 0; i < strlen(name); ++i)
{
charmap[name[i]]++;
}
int k = 26;
int sum = 0;
map<char, int>::iterator it = charmap.begin();
int inde[1000];
for(int i = 0; it != charmap.end(); ++it, ++i)
{
inde[i] = it->second;
}
sort(inde, inde + charmap.size(), compare);
for (int i = 0; i < charmap.size(); ++i) {
sum += inde[i] * k--;
}
cout<<sum<<endl;
}
}