问题描述
有一个长度为n的数组(n是10的倍数),每个数ai都是区间[0,9]中的整数。小明发现数组里每种数出现的次数不太平均,而更改第i个数的代价为bi,他想更改若干个数的值使得这10种数出现的次数相等(都等于n/10),请问代价和最少为多少。
输入格式
输入的第一行包含一个正整数。
接下来n行,第i行包含两个整数ai,b;,用一个空格分隔。
输出格式
输出一行包含一个正整数表示答案。
样例输入
10
1 1
1 2
1 3
2 4
2 5
2 6
3 7
3 8
3 9
4 10
样例输出
27
解题代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n,sum=0;
n=scan.nextInt();
int[] A=new int[n];
int[] B=new int[n];
for(int i=0;i<n;i++){
A[i]=scan.nextInt();
B[i]=scan.nextInt();
}
for(int i=0;i<n-1;i++){
if(A[i]==A[i+1]){
sum=sum+B[i];
}
}
System.out.println(sum);
scan.close();
}
}
运行结果
学习:
题目中提出,需要代价最小,因此:
- 然后考虑如何以最小代价达到目标状态。由于频率超出或低于目标频率n/10的元素都需要调整,因此我们需要采取一个有效策略,以保证在必要时优先调整代价最小的元素。(总是优先选择调整代价较低的元素)