首先定义一个map用来统计每个字母出现的次数,然后使用vector对每个字母以出现次数从大到小排序,最后将次数乘以由26开始依次减小的数字,计算出它们的和即为名字最大可能的漂亮度。
#include <iostream> #include <map> #include <algorithm> #include <vector> using namespace std; int main() { int n; cin >> n; map<char, int> letters; string s; vector<int> times; for (int i = 0; i < n; i++) { cin >> s; for (char letter : s) { if (letters.find(letter) == letters.end()) { letters.insert({letter, 1}); } else { letters[letter]++; } } int sum = 0; for (pair<char, int> letter : letters) { times.push_back(letter.second); } sort(times.begin(), times.end(), greater()); int count = 0; int number = 26; while (count < times.size()) { sum += number * times[count++]; number--; } cout << sum << endl; times.clear(); letters.clear(); } return 0; } // 64 位输出请用 printf("%lld")