有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?
输入描述:
每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不超过 12 且仅包含大写字母 A-J 的字符串。 n 不大于 50,且至少存在一个字符不是任何字符串的首字母。
输出描述:
输出一个数,表示最大和是多少。
输入例子1:
2 ABC BCA
输出例子1:
1875
1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include<map> 5 #include<math.h> 6 #include<set> 7 #include<algorithm> 8 using namespace std; 9 bool cmp(pair<char,long long> a,pair<char,long long> b){ 10 return a.second>b.second; 11 } 12 13 int main() 14 { 15 int n; 16 map<char,long long> m; 17 set<char>f;///保存首字母。首字母不能是0,即使首字母所占权重最小也不行。所以当10个字母都出现的话,需要把非首字母权重最小的字母设置为0 18 string str; 19 // vector<string> input; 20 21 while(cin>>n){ 22 for(int i=0;i<n;i++){ 23 cin>>str; 24 int k=str.size(); 25 f.insert(str[0]); 26 for(int i=0;i<k;i++){ 27 m[str[i]]+=pow(10,k-i-1); 28 } 29 } 30 vector<pair<char,long long>> v(m.begin(),m.end()); 31 sort(v.begin(),v.end(),cmp); 32 int len=v.size(); 33 int j=len-1; 34 while(len==10&&j>=0){ 35 if(f.find(v[j].first)==f.end()){ 36 v.erase(v.begin()+j); 37 break; 38 } 39 else j--; 40 } 41 len=v.size(); 42 int start=9; 43 long long sum=0; 44 for(int i=0;i<len;i++){ 45 sum+=v[i].second*start; 46 start--; 47 } 48 m.clear(); 49 v.clear(); 50 str.clear(); 51 cout<<sum<<endl; 52 } 53 }