问题描述
有一个长度为 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 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); } } 精彩文章
发表评论