首页 > 试题广场 >

统计同成绩学生(20)

[编程题]统计同成绩学生(20)
  • 热度指数:11334 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
本题要求读入N名学生的成绩,将获得某一给定分数的学生人数输出。

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


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

输入

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

输出

3 2 0
推荐
典型的“计数排序”的应用。由于是百分制成绩(0~100),可以设一个数组freq[101],其中freq[0]代表分数0出现的次数,freq[1]代表分数1出现的次数,。。。,freq[100]代表分数100出现的次数。
再设一数组fen[ ], 先输入n, 然后依次输入n个成绩,存入数组fen[ ], 同时统计该成绩出现的次数,即freq[ fen[ i ] ]++, 其中fen[i]代表输入的第i个成绩。
再设一个数组cha[ ], 输入k,然后输入要查询的k个成绩。
最后遍历数组cha[ ] , 在遍历的同时输出数组freq[ cha[i] ]的值即可。
参考代码如下:

#include<stdio.h>

#define N 100000
int fen[N]; //分数
int cha[N]; //要查询的分数

int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        int i,k;
        int freq[101]={0};  //0分~100分分别出现的次数
        for(i=0;i<n;i++)
        {
            scanf("%d",&fen[i]);    //输入某个分数
            freq[fen[i]]++;         //统计某个分数出现的次数
        }
        scanf("%d",&k);
        for(i=0;i<k;i++)scanf("%d",&cha[i]);    //输入要查询的分数
        for(i=0;i<k;i++)
        {   //要查询的分数出现的次数
            if(i==0)printf("%d",freq[cha[i]]);  //第1个数
            else printf(" %d",freq[cha[i]]);    //从第2个数开始,每个数前面有1个空格
        }
        printf("\n");   //最后一个数后面换行
    }
    return 0;
}

编辑于 2015-08-18 22:33:18 回复(2)
import collections
L = input().split()
N = eval(L.pop(0))
D = collections.Counter(L[:N])
L = [str(D[i]) if i in D else '0' for i in L[N + 1:]]
print(' '.join(L))

编辑于 2019-08-29 18:40:06 回复(0)

是不是一直EOFError: while reading the line.
我甚至一度怀疑自己对input的理解
别想自己哪步坑了,题目出问题了!!
换成以下数据:
10 60 75 90 55 75 99 82 90 75 50 3 75 90 88

# -*- coding : utf-8 -*-
from collections import Counter

line = list(input().split())
count = Counter(line[1:1 + int(line[0])])
_, *index = line[1 + int(line[0]):]
result = []
for i in index:
    if i not in count.keys():
        result.append('0')
    else:
        result.append(str(count[i]))
print(' '.join(result))
发表于 2019-05-30 14:08:27 回复(0)
List = [int(i) for i in input().split()]
List1 = List[1:List[0]+1]
List2 = List[List[0]+2:]
List3 = []
for i in List2:
    count = 0
    for j in List1:
        if i == j:
            count += 1
    List3.append(str(count))
print(' '.join(List3))

发表于 2019-03-26 10:04:50 回复(0)
while True:
    try:
        tempInput = list(map(int,input().split()))
        grades = tempInput[1:tempInput[0]+1]
        findGrades = tempInput[tempInput[0]+1:]
        result = []
        for i in findGrades[1:]:
            result.append(grades.count(i))
        print(' '.join(map(str,result)))
    except Exception:
        break
编辑于 2018-10-14 14:23:23 回复(0)

python解法:

MMP,这道题的输入只有一行,千万别当成了三行,所以要从一行的数据切出这三条信息。。

accept解法如下:

a=list(map(int,input().split()))
n,res=a[0],[]
for i in a[n+2:]:
    res.append(str(a[1:n+1].count(i)))
print(" ".join(res))

如果是输入三行,代码如下

a,b,c,res=input(),list(map(int,input().split())),list(map(int,input().split())),[]
for i in c[1:]:
    res.append(str(b.count(i)))
print(" ".join(res))
发表于 2017-10-13 08:29:06 回复(9)