欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PAT (Basic Level) Practice (中文)1038 统计同成绩学生

程序员文章站 2022-03-14 19:30:50
...

1038 统计同成绩学生(20)(20 分)

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

输入格式:

输入在第1行给出不超过10^5^的正整数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

我居然想用双重循环和二维数组来做,我可真是个小机灵鬼.
用双重循环肯定会超时,建一个成绩数组直接找就行了,因为不需要输出某成绩学生的个数,所以不用存储它

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
    int num;
    cin>>num;
    //用来存放成绩
    int ScoreNum[101]={0};
    //输入成绩 
    int tempScore=0;
    //数组下标表示这个数字 里面的内容表示数字的个数 
    for(int i=0;i<num;i++)
    {
        cin>>tempScore;
        ScoreNum[tempScore]++;
    }
    //查找个数 
    int findNum;
    cin>>findNum;
    //初始化 
    int *findStuScore=new int [findNum]; 
    //输入待查找成绩
    for(int i=0;i<findNum;i++)
    {
        cin>>findStuScore[i];
    }

    //现在改为对每个查找成绩,从学生成绩遍历,如果找到,就+1,如果没有就置为0
    for(int j=0;j<findNum;j++)
    {
        bool Aldfind=false;
        //如果这个成绩存在,就把它的个数覆盖为查找成绩 
        if(ScoreNum[findStuScore[j]]>0)
        {
            //查找结果+1 
            findStuScore[j]=ScoreNum[findStuScore[j]];  
            Aldfind=true;
        }
        //如果没有找到,当前结果置为-1 
        if(Aldfind==false)
        {
            findStuScore[j]=-1;
        } 
    }


    //输出最后结果 
    bool iscout=false;
    for(int j=0;j<findNum;j++)
    {
        if(iscout==true) 
        {
            cout<<" ";  
        }
        if(findStuScore[j]>0||findStuScore[j]==-1)
        {
            if(findStuScore[j]==-1)
            {
                cout<<0;
                iscout=true;
            }
            else
            {
                cout<<findStuScore[j];
                iscout=true;
            }
        }
    }
}