您的位置:首页 > 编程语言 > C语言/C++

1818[成绩转换]

2013-11-14 16:10 288 查看
Description

保存学生姓名和成绩,然后通过姓名查询该学生的成绩等级。

输入为百分制的成绩,将其转换成对应的等级,具体转换规则如下:

90~100 为 A;

80~89 为 B;

70~79 为 C;

60~69 为 D;

0~59 为 E;

Input

输入有多组数据。第一行为数据组数T。

对于每组数据,第一行包含两个整数 n(1<n<=15000)和 m(1<m<=10000),n 表示学生个数,m 表示查询次数。接下来 n 行,每行包含一名学生的姓名和成绩。再接下来 m 行,每行一个字符串,表示学生姓名。

注意: 数据有可能有重复名字的学生,以最后一次出现的成绩为准。

Output

对于每个查询,输出一行, 表示该学生成绩等级。如果输入数据不在 0~100 范围内,请输出一行:“Score is error!”。

=========================================================

题目不难

但是主要问题是数据量很大,最多会有15000个数据。所以普通算法虽然很好写,但是因为超时所以不能够通过。

之前写了1817,这里先是以为是cin和scanf的问题,后来发现也不是。

然后看了大牛们的代码,才知道需要用哈希或者map解决。

#include<iostream>
#include<string>

using namespace std;

struct Student
{
string Name;
int Score;
};

void Grade( int score )
{
int level;
level = score / 10;
switch ( level )
{
case 0 :
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
{
cout << 'E' << endl;
break;
}
case 6 :
cout << 'D' << endl;
break;
case 7 :
cout << 'C' << endl;
break;
case 8 :
cout << 'B' << endl;
break;
case 9 :
case 10 :
cout << 'A' << endl;
break;
default:
cout << "Score is error!" << endl;
}
}

int main()
{
string name;
Student S[15000];
int n, m, i, j;
int count;
cin >> count;
while( count-- )
{
cin >> n >> m;
for( i = 0; i < n; i++ )
{
cin >> S[i].Name >> S[i].Score;
}

while( m-- )
{
cin >> name;
for( i = 0; i < n; i++ )
if( name == S[i].Name )
Grade( S[i].Score );
}
}
return 0;
}

下面研究下哈希的使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ sicily