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;
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值