奖学金
小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg。每门课由平时成绩和考试成绩组成,满分为r。现在他知道每门课的平时成绩为ai ,若想让这门课的考试成绩多拿一分的话,小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。为了拿到奖学金,小v至少要花多少时间复习。
输入描述:
第一行三个整数n,r,avg(n大于等于1小于等于1e5,r大于等于1小于等于1e9,avg大于等于1小于等于1e6),接下来n行,每行两个整数ai和bi,均小于等于1e6大于等于1
输出描述:
一行输出答案。
输入例子:
5 10 9
0 5
9 1
8 1
0 1
9 100
输出例子:
43
解题
暴力,找到第一个最小学习时间,每次学习一个最小时间,成绩加一分,当到达满分的时候,找第二个最小学习时间。
同时 使用Long,不然出现了内存溢出的情况
1 import java.util.Scanner; 2 public class Main{ 3 public static void main(String[] args){ 4 Scanner in = new Scanner(System.in); 5 while(in.hasNext()){ 6 // 课程数 7 int n = in.nextInt(); 8 // 满分 9 long r = in.nextLong(); 10 // 平均分 11 long avg = in.nextLong(); 12 // 需要得到分数 13 long count = n*avg; 14 long study = 0; 15 // 平时成绩 16 long[] A = new long[n]; 17 // 提示一分花费时间 18 long[] B = new long[n]; 19 long minhour = Integer.MAX_VALUE; 20 int minIndex = -1; 21 for(int i =0;i<n;i++){ 22 A[i] = in.nextLong(); 23 B[i] = in.nextLong(); 24 // 去除平均分还需要获得分数 25 count-=A[i]; 26 // 找到最小时间提升分数的时间 27 if(minhour >B[i]){ 28 minhour = B[i]; 29 minIndex = i; 30 } 31 } 32 while(count>0){ 33 // 最小花费时间努力 34 while(count>0 && A[minIndex]<r){ 35 count-=1; 36 A[minIndex]+=1;// 成绩增加在平时分数上面 37 study+=minhour; 38 if(count<=0) break; 39 } 40 if(count<=0) break; 41 B[minIndex] = Integer.MAX_VALUE; 42 minhour = Integer.MAX_VALUE; 43 minIndex = -1; 44 for(int i =0;i<n;i++){ 45 // 找到最小时间提升分数的时间 46 if(minhour >B[i]){ 47 minhour = B[i]; 48 minIndex = i; 49 } 50 } 51 52 } 53 System.out.println(study); 54 55 } 56 in.close(); 57 } 58 }