您的位置:首页 > 其它

奖学金

2017-03-20 11:15 134 查看

题目描述

小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

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class Main {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = Integer.parseInt(sc.next());
int r = Integer.parseInt(sc.next());
int avg = Integer.parseInt(sc.next());
int[] a = new int
;
int[] b = new int
;
for (int i = 0; i < n; i++) {
a[i] = Integer.parseInt(sc.next());
b[i] = Integer.parseInt(sc.next());
}
System.out.println(func(n, r, avg, a, b));
}
sc.close();
}

private static long func(long n, long r, long avg, int[] a, int[] b) {
long time = 0;
sort(a, b);
for (int i = 0; i < n; i++) {
if (sum(a) >= n * avg) {
break;
}
while (a[i] < r) {
a[i]++;
time += b[i];
if (sum(a) >= n * avg) {
break;
}
}
}
return time;
}

private static long sum(int[] a) {
long sum = 0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
return sum;
}

@SuppressWarnings({ "rawtypes", "unchecked" })
public static void sort(int[] a, int[] b) {
TreeMap<Integer, ArrayList<Integer>> hm = new TreeMap<Integer, ArrayList<Integer>>();
for (int i = 0; i < b.length; i++) {
if (hm.containsKey(b[i])) {
hm.get(b[i]).add(a[i]);
} else {
hm.put(b[i], new ArrayList<Integer>());
hm.get(b[i]).add(a[i]);
}
}
for (Map.Entry x : hm.entrySet()) {
Integer key = (Integer) x.getKey();
ArrayList<Integer> value = (ArrayList<Integer>) x.getValue();
Collections.sort(value, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 < o2 ? 1 : -1;
}
});
hm.put(key, value);
}

int idx = 0;
for (Map.Entry x : hm.entrySet()) {
Integer key = (Integer) x.getKey();
ArrayList<Integer> value = (ArrayList<Integer>) x.getValue();
for (int i = 0; i < value.size(); i++) {
a[idx] = value.get(i);
b[idx++] = key;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: