首页 > 技术文章 > PAT 乙级 统计同成绩学生

dudu-bird 2016-02-03 18:57 原文

题目描述

本题要求读入N名学生的成绩,将获得某一给定分数的学生人数输出。

输入描述:

输入在第1行给出不超过105的正整数N,即学生总人数。随后1行给出N名学生的百分制整数成绩,中间以空格分隔。最后1行给出要查询的分数个数K(不超过N的正整数),随后是K个分数,中间以空格分隔。

输出描述:

在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。

输入例子:

10
60 75 90 55 75 99 82 90 75 50
3 75 90 88

输出例子:

3 2 0
    scanf("%d", &count);
    int search[count] = {0}, people[count] = {0};

  第一版代码出现编译错误 error: variable-sized object may not be initialized int search[count] = {0}, people[count] = {0}; ”,数组定义时不能用变量作为数组长度,即只能定义定长数组。

#include<stdio.h>
#include<stdlib.h>
const int maxn = 100;
int main(){
    int N, count, search;
    int notFirst = 0;
    int grades[maxn] = {0};
    scanf("%d", &N);
    for(int i = 0; i < N; i++){
        scanf("%d", &grades[i]);
    }
    
    scanf("%d", &count);
    while(scanf("%d", &search)){
        int n = 0;
        for(int i = 0; i < sizeof(grades); i++){
            if(search == grades[i]) n++;
        }
        if(notFirst) printf(" ");
        printf("%d", n);
        notFirst++;
    }
    return 0;
}

  第二版代码,很不幸超时了,解题思路不太正确,对于较少的数据量,以上方法还可以有很好的性能。但对于大量的输入成绩,查询每个成绩都要把grades数组遍历一遍,性能太差。

  改进方法:将grades数组改造成长度为100的数组,每个位置分别代表0-100各个分数出现的次数。查询成绩时只需输出对应数字即可,例:78,输出grades[77]。

#include<stdio.h>
const int maxn = 101;

int main(){
    int grades[maxn] = {0};
    int n = 0, times = 0, notFirst = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        int grade = 0;
        scanf("%d", &grade);
        grades[grade]++;
    } 
    scanf("%d", &times);
    for(int i = 0; i < times; i++){
        int search = 0;
        scanf("%d", &search);
        if(notFirst) printf(" ");
        printf("%d", grades[search]);
        notFirst++;
    }
    return 0;
}

  成功了!原来想的太复杂了···

推荐阅读