大概思路:遇到极值问题一般想到贪心解决,这里很容易想到按课程复习代价从小到大排序,贪心的证明用反证法证明即可。
个人踩雷:
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); } } }