解题思路:

  1. 根据输入的每门课程对可能提分所需要的时间进行从小到大的排序,因为后面需要得出花费的最少复习时间,所以要先把能花时间少的提分科目提到满分;
  2. 使用一个TreeSet实现排序,因为TreeSet对整型数据有自动排序功能,而且可以去重;
  3. 将提升花费时间作为key,科目目前还可以得到的分数作为value存入一个map中,这样后面在获取数据时时间复杂度会很好。对于相同时间花费的科目,对应的value值相应叠加
  4. 对排好序的保存花费时间的set集合从小到大进行遍历,都修成满分,指导总分达到各科平均分要求

    代码实现

    import java.util.*;
    

public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int r = sc.nextInt();
int avg = sc.nextInt();
int[] a = new int[n];
int[] b = new int[n];
long score = 0;
long time = 0;
TreeSet<integer> set = new TreeSet<>();
for(int i=0; i<n; i++){
a[i] = sc.nextInt();
b[i] = sc.nextInt();
set.add(b[i]);
score = score + a[i];
}</integer>

        Map<Integer,Integer> map = new HashMap<>();
        for(int j=0; j<n; j++){
            if(map.containsKey(b[j])){
                map.put(b[j], map.get(b[j])+r-a[j]);
            }else{
                map.put(b[j],r-a[j]);
            }

        }
        while(score < n*avg){
            for(Integer ti:set){
                if((n*avg)-score <= map.get(ti)){
                    time = time + ti*((n*avg)-score);
                    score = n*avg;
                    break;
                }else{
                    score = score + map.get(ti);
                    time = time + ti*map.get(ti);
                }
            }
        }
        System.out.println(time);
    }
}

}
```