奖学金
题目
小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
思路:
根据bi(修课时间)进行排序,按照bi的顺序依次修课程,直到该门课程修到满分,或者总学分达到avg*n则结束。将修课的过程所需的时间加起来即为所求。代码很简单,就一个排序加循环。
代码
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[][] time = new int[n][n];
for(int i = 0; i < n; i++){
time[0][i] = sc.nextInt();
time[1][i] = sc.nextInt();
}
bubbleSort(time, n);
int sum = 0;
int target = avg * n;
for(int i = 0; i < n; i++){
sum += time[0][i];
}
int p = 0;
int add = 0;
while(sum < target){
int k = 0;
while(time[0][p]+k < r && sum < target){
k++;
sum ++;
}
add += time[1][p] * k;
p++;
}
System.out.println(add);
}
}
public static void bubbleSort(int[][] time, int n){
for(int i = 0; i+1 < n; i++){
for(int j = 1; j+i < n; j++){
if(time[1][j] < time[1][j-1]){
int tmp = time[1][j];
time[1][j] = time[1][j-1];
time[1][j-1] = tmp;
tmp = time[0][j];
time[0][j] = time[0][j-1];
time[0][j-1] = tmp;
}
}
}
}
}
ps:只过了80%的测试样例,还需要再完善。
题目原地址——牛客网