奖学金
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 90 5
9 1
8 1
0 1
9 100
输出例子:
43import 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; } } } }
相关文章推荐
- 谁获得了最高奖学金
- noip2005-奖学金 2008.10.17
- 哈理工OJ 1219 谁拿了最多奖学金
- NOIP200505谁拿了最多的奖学金
- 奖学金评分系统(系统分析与设计版与Delphi实现代码)
- 题目60 谁获得了最高奖学金
- NOIP2005提高组——谁拿了最多的奖学金(scholar)
- NYOJ 60谁获得了最高奖学金
- NYoj60谁获得了最高奖学金(结构体)
- 洛谷1093奖学金
- 洛谷 P1093 奖学金
- codeves天梯 谁拿了最多奖学金
- 谁拿了最多奖学金
- 奖学金
- 04:奖学金
- [NOIP]奖学金(1)
- vijos p1001 谁拿了最多奖学金
- [NOIp2005] 谁拿了最多奖学金
- 【奖】51CTO学院软考班发奖学金啦(中高项、监理、网工、信息安全)
- NYOJ 60 谁获得了最高奖学金