此题目要计算漂亮度,根据题意,漂亮度要尽可能的大,而且每个字母的漂亮度不同,范围是[1,26],那么怎么分配者[1,26]的权重能使最后的值最大呢?把出现次数多的给权重大就解决了呗!
举个例子:
zhangsan
| 字母 | a | g | h | n | s | z |
|---|---|---|---|---|---|---|
| 次数 | 2 | 1 | 1 | 2 | 1 | 1 |
很显然a和n都出现两次其他出现一次,那最后的综合就是sum=2*26+2*25+24+23+22+21=192
那整体思路就变成了
(1)统计字母出现次数
(2)将出现次数从大到小排序
(3)将排序好的出现次数乘以26,25,24…依次减小
代码如下
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
bool sortby(int a, int b)
{
if (a>b)
{
return true;
}
else
{
return false;
}
}
int main()
{
int n, len, sum, trans[26];
string inStr;
memset(trans, 0, sizeof(int)* 26);
cin >> n;
for (int i = 0; i<n; i++)
{
cin >> inStr;
len = inStr.size();
sum = 0;
for (int j = 0; j<len; j++)
{
if (inStr[j] >= 'a'&&inStr[j] <= 'z')//小写字母
{
trans[inStr[j] - 'a']++;
}
else if (inStr[j] >= 'A'&&inStr[j] <= 'Z')//大写字母
{
trans[inStr[j] - 'A']++;
}
else//非法
{
return 0;
}
}
sort(trans, trans + 26, sortby);
for (int k = 0; k<26 && trans[k] != 0; k++)
{
sum += (26 - k)*trans[k];
}
cout << sum << endl;
memset(trans, 0, sizeof(int)* 26);
}
return 0;
}
结论:对于字母的计数用一个长度为26的数组,这种方法很常用。
3632

被折叠的 条评论
为什么被折叠?



