问题描述
有一个长度为 n 的数组( n 是 10 的倍数),每个数 ai 都是区间 [0,9] 中的整数。小明发现数组里每种数出现的次数不太平均,而更改第 i 个数的代价为 bi,他想更改若干个数的值使得这 10 种数出现的次数相等(都等于 n/10),请问代价和最少为多少。
输入格式
输入的第一行包含一个正整数 n。
接下来 n 行,第 i 行包含两个整数 ai,bi ,用一个空格分隔。
输出格式
输出一行包含一个正整数表示答案。
样例输入
10 1 1 1 2 1 3 2 4 2 5 2 6 3 7 3 8 3 9 4 10
样例输出
27
样例说明
只更改第 1,2,4,5,7,8 个数,需要花费代价 1+2+4+5+7+8=27。
评测用例规模与约定
对于 20% 的评测用例, n≤1000;
对于所有评测用例, n≤10^5,0<bi≤2×10^5。
java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n=scan.nextInt();
int n1=n;
int a[]=new int[10];
int b[][]=new int[10][n];
int index0=0,index1=0,index2=0,index3=0,index4=0,
index5=0,index6=0,index7=0,index8=0,index9=0;
int p=n/10;
int ans=0;
while(n1>0) {
n1--;
int k=scan.nextInt();
a[k]++;
if(k==0) {
b[k][index0]=scan.nextInt();
index0++;
}
else if(k==1) {
b[k][index1]=scan.nextInt();
index1++;
}
else if(k==2) {
b[k][index2]=scan.nextInt();
index2++;
}
else if(k==3) {
b[k][index3]=scan.nextInt();
index3++;
}
else if(k==4) {
b[k][index4]=scan.nextInt();
index4++;
}
else if(k==5) {
b[k][index5]=scan.nextInt();
index5++;
}
else if(k==6) {
b[k][index6]=scan.nextInt();
index6++;
}
else if(k==7) {
b[k][index7]=scan.nextInt();
index7++;
}
else if(k==8) {
b[k][index8]=scan.nextInt();
index8++;
}
else if(k==9) {
b[k][index9]=scan.nextInt();
index9++;
}
}
for(int i=0;i<=9;i++) {
if(a[i]>p) {
int qv=a[i]-p;
Arrays.sort(b[i]);
while(qv>0) {
qv--;
if(i==0) {
ans+=b[i][n-index0];
index0--;
}
else if(i==1) {
ans+=b[i][n-index1];
index1--;
}
else if(i==2) {
ans+=b[i][n-index2];
index2--;
}
else if(i==3) {
ans+=b[i][n-index3];
index3--;
}
else if(i==4) {
ans+=b[i][n-index4];
index4--;
}
else if(i==5) {
ans+=b[i][n-index5];
index5--;
}
else if(i==6) {
ans+=b[i][n-index6];
index6--;
}
else if(i==7) {
ans+=b[i][n-index7];
index7--;
}
else if(i==8) {
ans+=b[i][n-index8];
index8--;
}
else {
ans+=b[i][n-index9];
index9--;
}
}
}
}
System.out.println(ans);
}
}