最大映射

有 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 }

 

posted on 2017-10-19 11:40  wsw_seu  阅读(243)  评论(0编辑  收藏  举报

导航