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

题目描述

小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************
");
    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
",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);

    }
}

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

原文地址:https://www.cnblogs.com/chxuan/p/8232101.html