科大讯飞机试题—修改成绩

综述

  做了科大讯飞的机试题,选择题分布很均匀,也很常规,考验基础知识。还是基础不牢,地动山摇,照着晚上的阿里题目,已经算是简单很多了,阿里爸爸又是高数,又是概率论,又是深度学习之类的,编程考查的也非常细致基础,太难!!!!
  哎,菜鸡先匿了,匿了。不对,我们接着讨论这个科大讯飞的编程题。
题目描述
  华老师的 n 个学生参加了一次模拟测验,考出来的分数很糟糕,但是华老师可以将成绩修改成[0,100]中的任意值,所以他想知道,如果要使所有人的成绩的平均分不少于 X 分,至少要改动多少人的分数?
输入
第一行一个数 T,共 T 组数据(T<= 10)
接下来对于每组数据:
第一行两个整数 n 和 X。(1<= n <=1000,0<= X <=100)
第二行 n 个整数,第 i 个数 Ai 表示第 i 个学生的成绩。(0<= Ai <=100)
输出
共T行,每行一个整数,代表最少的人数。

样例输入
2
5 60
59 20 30 90 100
5 60
59 20 10 10 100

样例输出
1
2

题目分析

  这个题目稍微有点点绕,但是不难,我们来捋一下。
  所有人的分数加起来平均后不够老师要求的平均分,这个时候老师可以修改分数,且求的是最少改动,则我们可以这样,给最少分数的人直接加到100,这样的话在仅改动一次的情况下对总分数的增长最大
  此时再次统计总分与达标线比较。合格则退出,不合格就再算分数倒数第二少的。
  依次类推下去。

代码实现

#include
#include
using namespace std;

int main(){

    int t ;                         //分组数目 
    scanf("%d",&t);
    int *size = new int[t];         //定义t大小的一维数组来每个分组的学生数   
    int *average = new int[t];      //每组的平均成绩 
    int **score = new int*[t];      //每个人的成绩,存在一个二位数组中,每一行为一个组的成绩 

    for(int i = 0;inew int [1000];     //动态申请二位数组 
    }
    int *temp = new int[t];         //达标所需总分数 
    int *count = new int[t];        //统计需要的人数

    /*int temp[t];此处申请数组时不可以采用前面的方式,
    这是不合法的,虽然有些编译器是可以通过,比如 DEVC++,
    因为函数栈的要求,就是在函数运行前,分配好所有变量的空间,
    t是不定的,所以不能再运行前,就分配好空间。
    应采用动态申请的方式,在执行的时候,才分配空间,
    这是合法的方式。
    或者将变量定义为const常量 */ 

    for(int i=0;iscanf("%d %d",&size[i],&average[i]);
        for(int k=0;kscanf("%d",&score[i][k]);
        }
    }
    //sort排序 ,将成绩数组每一行都从小到大排列 
    for(int i =0;ifor(int i=0;i0;
        int temp1=0;                   //统计每组所的分数的累加值 
        temp[i] = size[i]*average[i];  
        for(int k=0;kwhile(temp1int j = 0;
        temp1 += (100-score[i][j++]);
        ++count[i];
    }
        printf("%d\n",count[i]);
    }
    return 0;
}

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