名企笔试:2016网易招聘笔试题(奖学金)

时间:2022-02-18 18:53:37

题目描述

小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

输出描述:

一行输出答案。

输入例子:

5 10 9
0 5
9 1
8 1
0 1
9 100

输出例子:

43

–分析题目,其中需要求至少花多长时间?
–可知用贪心算法,从复习容易得分的课程开始复习,则根据 bi 需要先对科目进行排序( 此处我选择了快排)然后再从头进行“复习”,直到平均分不小于 avg .
测试用例中可以看出,有循环输入部分,则需要用数组存储数据。为了方便操作,我定义了一个结构体类型:

typedef struct{
int ai; //平时成绩
int bi; //考试成绩增加一分所用复习时间
int record; //记录此科目差多少分满分 在后面计算中值会变化 用来判断是否已经复习到满分
}

使用了快排算法对课程进行排序:

void QuickSort(AB ab[],int s,int n)       //使用快排 根据课程的复习容易程度进行排序
{
int i=s,j=n;
AB tmp;
if(s<n)
{
tmp = ab[s];
while(i!=j)
{
while(j>i&&ab[j].bi>tmp.bi)
j--;
ab[i]=ab[j];
while(i<j&&ab[i].bi<=tmp.bi)
i++;
ab[j]=ab[i];

}
ab[i] =tmp;
QuickSort(ab,s,i-1);
QuickSort(ab,i+1,n);

}
}

示例代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct { //科目
int ai; //平时成绩
int bi; //考试成绩增加一分所用时间
int record; //记录差多少分满分
}AB;
void QuickSort(AB ab[],int s,int n);
int main()
{
printf("*************start************\n");
int n,r,avg; //课程数、满分、平均成绩
int i;
scanf("%d %d %d",&n,&r,&avg);
AB ab[9999];
for(i=0;i<n;i++)
{
scanf("%d %d",&ab[i].ai,&ab[i].bi);
ab[i].record=r-ab[i].ai;
}
QuickSort(ab,0,n-1);
double avgs;
int sum=0;
for(i=0;i<n;i++)
sum+=ab[i].ai;
avgs=sum/n*1.0;
int time=0;
while(avgs<avg)
{
for(i=0;i<n;i++)
{
if(ab[i].record!=0)
{
time+=ab[i].bi;
ab[i].record--;
sum++;
break;
}
}
avgs=sum/n*1.0;
}
printf("%d\n",time);
return 0;
}


void QuickSort(AB ab[],int s,int n) //使用快排 根据课程的复习容易程度进行排序
{
int i=s,j=n;
AB tmp;
if(s<n)
{
tmp = ab[s];
while(i!=j)
{
while(j>i&&ab[j].bi>tmp.bi)
j--;
ab[i]=ab[j];
while(i<j&&ab[i].bi<=tmp.bi)
i++;
ab[j]=ab[i];

}
ab[i] =tmp;
QuickSort(ab,s,i-1);
QuickSort(ab,i+1,n);

}
}

如果有错误,望留言斧正!如有更好的方法,可留言学习下!