网易笔试题分享:奖学金

小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg。每门课由平时成绩和考试成绩组成,满分为r。现在他知道每门课的平时成绩为ai ,若想让这门课的考试成绩多拿一分的话,
小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。

为了拿到奖学金,小v至少要花多少时间复习。


这道题有几个坑,一是当前的成绩已经够拿到奖学金了,而是存储时间的类型要设置为long,int 是不够用的   代码如下,简单的动态规划

思路是先从得到1分的最短时间科目入手

import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;

//  构造比较器
class stu implements Comparable<stu>{
	int start;
	int xiao;
	@Override
	public int compareTo(stu s2) {
		if(this.xiao<s2.xiao)
			return -1;
		else if(this.xiao>s2.xiao)
			return 1;
		else{
			if(this.start<s2.start)
				return -1;
			else
				return 1;
		}
	}
	
}
public class Main {
	public static long  getMinTime(int n,int r,int avg,LinkedList<stu> set,int score){
		int needScore=avg*n;  //需要的分数
		if(needScore<=score)  // 如果当前的分数大于需要的分数,就不用往下了。
			return 0;
		if(avg>r)	     // 可能有要求平均分大于总分的情况,也不用往下了。
			return 0;    
		long time=0;  // 需要的时间
		Iterator<stu> it=set.iterator();
		while(it.hasNext()){
			stu s=it.next();
			if((score+r-s.start)<=needScore){
				time+=(r-s.start)*s.xiao;
				score+=r-s.start;
			}
			else{
				time+=(needScore-score)*s.xiao;
				break;
			}
		}
		return time;
	}
	
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			int n=sc.nextInt();
			int r=sc.nextInt();
			int avg=sc.nextInt();
			int score=0;
			LinkedList<stu> set=new LinkedList<stu>();
			for (int i = 0; i < n; i++) {
				stu s=new stu();
				s.start=sc.nextInt();
				s.xiao=sc.nextInt();
				score+=s.start;
				set.add(s);
			}
			Collections.sort(set);
			System.out.println(getMinTime(n,r,avg,set,score));
		}
	}
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值