网易笔试题分享:奖学金

小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{
	int start;
	int xiao;
	@Override
	public int compareTo(stu s2) {
		if(this.xiaos2.xiao)
			return 1;
		else{
			if(this.start set,int score){
		int needScore=avg*n;  //需要的分数
		if(needScore<=score)  // 如果当前的分数大于需要的分数,就不用往下了。
			return 0;
		if(avg>r)	     // 可能有要求平均分大于总分的情况,也不用往下了。
			return 0;    
		long time=0;  // 需要的时间
		Iterator 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 set=new LinkedList();
			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));
		}
	}
}


你可能感兴趣的:(算法)