解题思路:
- 根据输入的每门课程对可能提分所需要的时间进行从小到大的排序,因为后面需要得出花费的最少复习时间,所以要先把能花时间少的提分科目提到满分;
- 使用一个TreeSet实现排序,因为TreeSet对整型数据有自动排序功能,而且可以去重;
- 将提升花费时间作为key,科目目前还可以得到的分数作为value存入一个map中,这样后面在获取数据时时间复杂度会很好。对于相同时间花费的科目,对应的value值相应叠加
- 对排好序的保存花费时间的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); } }
}
```