最大映射
有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?
输入描述:每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不超过 12 且仅包含大写字母 A-J 的字符串。 n 不大于 50,且至少存在一个字符不是任何字符串的首字母。
输出描述:输出一个数,表示最大和是多少。
输入例子:
2
ABC
BCA
输出例子:
1875
思路
以题目的输入例子分析计算过程
ABC=100×A+10×B+C
BCA=100×B+10×C+A
则ABC+BCA=110×B+101×A+11×C(根据权值从大到小排序)。
要使和最大,则权值越大的映射的数字应越大,即B=9,A=8,C=7,故最大和为1875.
可以将n个字符串相加,根据以上方法求出每个字符的权值,并根据权值大小对字符从大到小进行排序。权值越大映射数字越大。注意,题目中要求了字符串不能有前导零,我们可以用一个标识符记录每个字符是否可为0。若权值最低的字符不能为0,则向前寻找可以为0且权重最小的字符,用该字符与权值最低的字符交换,同时权重向前移。。。例如
字符 权重 是否可为0(0表示可以)
A 100 1
J 11 1
C 10 0
D 9 0
E 8 1
B 7 0
G 6 0
H 5 1
I 4 1
F 3 1
权重最低的字符为F,它的标识符为0,则该字符可以为0,故寻找权重最小且可以为0的字符,在这个问题中,该字符为G。交换并向前移。即
字符 权重 是否可为0(1表示可以)
A 100 1
J 11 1
C 10 0
D 9 0
E 8 1
B 7 0
H 5 1
I 4 1
F 3 1
G 6 0
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main{
public static void main(String []args){
Scanner cin=new Scanner(System.in);
int n;
while(cin.hasNext()){
n=cin.nextInt();
String[]str=new String[n];
Element[]e=new Element[10];
for(int i=0;i<10;i++)e[i]=new Element();
for(int i=0;i<n;i++){
str[i]=cin.next();
int l=str[i].length();
long base=1;
for(int j=l-1;j>=0;j--,base*=<