您的位置:首页 > 其它

网易笔试题分享:奖学金

2017-03-24 13:08 239 查看
小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));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: