有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?
有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?
每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不超过 12 且仅包含大写字母 A-J 的字符串。 n 不大于 50,且至少存在一个字符不是任何字符串的首字母。
输出一个数,表示最大和是多少。
2 ABC BCA
1875
import java.util.*; public class Main { private void sln() { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); long sum = 0; // 两个元素分别对应 总权重、是否作过首字母 long[][] rec = new long[10][2]; for (int i = 0; i < n; i++) { String str = sc.next(); char[] chars = str.toCharArray(); // 从低位看到高位 for (int j = 1; j <= chars.length; j++) { int index = chars[chars.length - j] - 'A'; long weight = (long) Math.pow(10, j - 1); rec[index][0] += weight; if (j == chars.length) rec[index][1] = 1; } } // 按总权重排序 Arrays.sort(rec, Comparator.comparing(a -> a[0])); // 要分配的数字 0-9 int[] digits = new int[10]; for (int i = 0; i < 10; i++) digits[i] = i; // 作过首字母的话就把0和后面数字交换 for (int i = 0; i < 10; i++) { if (rec[i][1] == 1) { int temp = digits[i]; digits[i] = digits[i + 1]; digits[i + 1] = temp; } else break; } // 每个字母的总权重 乘上 对应数字 for (int i = 0; i < 10; i++) { sum += rec[i][0] * digits[i]; } System.out.println(sum); } public static void main(String[] args) { new Main().sln(); } }