大概思路:遇到极值问题一般想到贪心解决,这里很容易想到按课程复习代价从小到大排序,贪心的证明用反证法证明即可。
个人踩雷:
1 输入有多个测试样例,需要Scanner.hasNext();
2 看测试数据的范围,可以看出int不够大,需要使用long。
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 full=sc.nextInt();
int avg=sc.nextInt();
int[][] nums=new int[n][2];
for(int i=0;i<n;i++){
nums[i][0]=sc.nextInt();
nums[i][1]=sc.nextInt();
}
Arrays.sort(nums,(o1,o2)->o1[1]-o2[1]);//按复习代价从小到大排序
long sum=0;
for(int[] a:nums) {
sum+=a[0];
}
long limit=avg*n;
int index=0;
long time=0;
while(sum<limit){
int tmp=full-nums[index][0];
if(tmp+sum<=limit){ //如果一门课程复习到满分,小于限制,
time+=tmp*nums[index][1];
sum+=tmp;
index++;
}
else{ //如果一门课程复习到满分,大于限制,
time+=(limit-sum)*nums[index][1];
sum=limit;
}
}
System.out.println(time);
}
}
}


京公网安备 11010502036488号