时间限制:1秒
空间限制:32768K
有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?
输入描述:
每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不超过 12 且仅包含大写字母 A-J 的字符串。 n 不大于 50,且至少存在一个字符不是任何字符串的首字母。
输出描述:
输出一个数,表示最大和是多少。
输入例子1:
2 ABC BCA
输出例子1:
1875
注意两点:
1.不能用int,不然会溢出,幸好clang是64位的emmmm;
2.注意那个字符串没有前导零,一开始没怎么看懂这一句;
result:
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
int main(void)
{
int i;
int n;
int j;
int b[10];
unsigned long int x;
unsigned long int re;
unsigned long int max;
map<char, unsigned long int> m;
unsigned long int a[10];
//vector<string> s;
for (i = 0; i<10; i++)
{
m[i + 'A'] = 0;
b[i]=0;
}
cin >> i;
for (n = 0; n<i; n++)
{
string temp;
cin >> temp;
//s.push_back(temp);
x = 1;
b[temp[0]-'A']=1;
for (j = temp.size() - 1; j >= 0; j--)
{
m[temp[j]] += x;
//a[temp[j]-'A']+=x;
x = x * 10;
}
x = 1;
}
for (i = 0; i<10; i++)
{
a[i] = m[i + 'A'];
}
j=0;
max=a[0];
for(i=0;i<10;i++)
{
if(b[i]==0&&a[i]<max)
{
j=i;
max=a[j];
}
}
a[j]=0;
sort(a, a + 10);
re = 0;
for (i = 0; i<10; i++)
{
re += a[i] * i;
}
cout << re << endl;
}