2017網易網際網路內推筆試題(獎學金問題)
阿新 • • 發佈:2019-01-28
//來源:網易
//獎學金
//題目描述:小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;
}
}