代码
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Scanner;
public class T08 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n];
int[] b = new int[n];
in.nextLine();
if (n % 10 == 0) {
for (int i = 0; i < n; i++) {
String str = in.nextLine(); //输入数和代价
str = str.replace(" ", "");
a[i] = Integer.parseInt(String.valueOf(str.charAt(0)));
if (str.length() == 2) {
b[i] = Integer.valueOf(String.valueOf(str.charAt(1)));//char转string转integer
} else if (str.length() == 3) {
str = String.valueOf(str.charAt(1)) + String.valueOf(str.charAt(2));
b[i] = Integer.parseInt(str);
} else if (str == "") {
i--;
a[i] = 0;
}
}
int q = n / 10;//计算最多出现的次数
//[[数组a的值,出现次数,多出次数,]]
int k;
int l = 0;
int[][][] c = new int[n][2][n];
int count = 0;
for (int i = 0; i < a.length; i++) {
k = i - 1;//索引在自己前面
do {//条过了
if (i == 0) {
break;
}//跳过k为-1,i为0,
if (a[i] == a[k]) {
l = 1;
}
k -= 1;
} while (k > 0);
if (l == 1) {
l = 0;
continue;
}//判断是不是第一次出现,不是就跳过
c[i][0][0] = a[i];
int m = 0;
for (int j = i; j < a.length; j++) {
if (a[i] == a[j]) {
count += 1;
c[i][1][m++] = b[j];
}
}
for (int j = 0; j < a.length; j++) {
if (a[i] == a[j]) {
}
}
c[i][0][1] = count;
count = 0;
c[i][0][2] = c[i][0][1] - q;
} //统计重复次数
//复制三维数组
int[][][] d = new int[n][2][n];
int o = 0;
for (int i = 0; i < c.length; i++) {//固定c的索引
for (int j = 0; j < c.length; j++) {//固定d的索引
if (c[i][0][0] == j && c[i][0][1] !=0) {//c的。。值和d的索引相当
for (int m = 0; m < c[i][0].length; m++) {//
d[j][0][m] = c[i][0][m];
}
for (int m = 0; m < c[i][1].length; m++) {//
d[j][1][m] = c[i][1][m];
}
}
}
}
int sum = 0;
for (int i = 0; i <d.length; i++) {
ArrayList<Integer> list = new ArrayList();
if (d[i][0][1] > q) {//只有超过最大出现次数的才执行
for (int j = 0; j < d[i][1].length; j++) {
list.add(d[i][1][j]);//收集单个a的值的代价所有代价
// list.remove("0");//去除无意义的
}
Collections.sort(list);
Collections.reverse(list); //单个a的值的代价排序
for (int j = list.size(); j >= 0; j--) {
if (list.size() > q) {
sum += list.get(j - 1);
list.remove(j-1);
}
}
}
}
System.out.println(sum);
}
}
}
题目描述:
有一个长度为 n 的数组(n 是 10 的倍数),每个数 ai 都是区间 [0, 9] 中的整数。小明发现数组里每种数出现的次数不太平均,而更改第 i 个数的代价为bi,他想更改若干个数的值使得这 10 种数出现的次数相等(都等于n/10),请问代价和最少为多少。
输入格式:
输入的第一行包含一个正整数 n 。
接下来 n 行,第 i 行包含两个整数 ai , bi ,用一个空格分隔。
输出格式:
输出一行包含一个正整数表示答案。
关键词:java,多维数组