2017网易互联网内推笔试题(奖学金问题)

来源:互联网 发布:python主流版本 编辑:程序博客网 时间:2024/05/18 21:42

//来源:网易
//奖学金
//题目描述:小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;    }}
1 0
原创粉丝点击