1. 程式人生 > >2017網易網際網路內推筆試題(獎學金問題)

2017網易網際網路內推筆試題(獎學金問題)

//來源:網易
//獎學金
//題目描述:小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
//
//輸出描述:一行輸出答案。
//
//解題思路:這是一道動態規劃問題,難。
// 自己想不明白,看別人的答案
// 分析思路:資料結構使用了列表list
// 為了求至少花多長時間複習,那麼經歷多花時間在所需時間少的課程上,使其達到滿分;
// 所以對儲存的節點資料,根據其所需時間的大小排序,先計算耗時少的課程得分,並使其
// 逐漸增加,最後達到要求平均分的目的。
//執行結果:執行時間:166ms
// 佔用記憶體:5347k

import java.text.DecimalFormat;
public class getJXJ
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        while (in.hasNext())
        {
            int n = in.nextInt();
            int r = in.nextInt();
            int avg = in.nextInt();
            List<Node> list = new
ArrayList<Node>(); for(int i=0; i<n; i++){ int x = in.nextInt(); int y = in.nextInt(); list.add(new Node(x, y)); } compute(list, r, avg); } } public static void compute(List<Node> list, int
r, int avg){ double num = list.size()*avg; for (int i = 0; i < list.size(); i++) { num -= list.get(i).getAi(); } List<Node> list1 = new ArrayList<Node>(); //新建一個list,將每門課的滿分減去當前得分作為ai節點,bi節點是每門課複習所需時間 for (int i = 0; i < list.size(); i++) { list1.add(new Node(r-list.get(i).getAi(), list.get(i).getBi())); } //比較list1中每門課複習所需時間,並進行從小到大排序 Collections.sort(list1, new Comparator<Node>() { @Override public int compare(Node o1, Node o2) { // TODO Auto-generated method stub return o1.getBi().compareTo(o2.getBi()); } }); double time = 0; for (int i = 0; i < list1.size(); i++) { if (num>0) //沒達到平均分 { if (num>list1.get(i).getAi()) //若第i門課所需得分(達到滿分)小於達到平均分所需分數 { num -= list1.get(i).getAi(); //總數求和裡面減去這門課的得分 time += list1.get(i).getAi() * list1.get(i).getBi(); //學習第i門課所需時間 }else { //最後一門課無需達到滿分的情況 time += num*list1.get(i).getBi(); break; } }else {//達到平均分 break; } } //數字格式化顯示 DecimalFormat decimalFormat = new DecimalFormat("#.##"); //#代表數字的一位阿拉伯數字,若該位不存在數字,則不顯示 // System.out.println(time); System.out.println(decimalFormat.format(time)); } } class Node{ private Integer ai; private Integer bi; public Node(int ai, int bi){ this.ai=ai; this.bi=bi; } public Integer getAi(){ return this.ai; } public Integer getBi(){ return this.bi; } }