题目1014:排名
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:9361
解决:2820
-
题目描述:
-
今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的考生,并将他们的成绩按降序打印。
-
输入:
-
测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N < 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号(题目号由1到M)。
当读入的考生人数为0时,输入结束,该场考试不予处理。
-
输出:
-
对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考号的升序输出。
-
样例输入:
-
4 5 25 10 10 12 13 15 CS004 3 5 1 3 CS003 5 2 4 1 3 5 CS002 2 1 2 CS001 3 2 3 5 1 2 40 10 30 CS001 1 2 2 3 20 10 10 10 CS000000000000000001 0 CS000000000000000002 2 1 2 0
-
样例输出:
-
3 CS003 60 CS001 37 CS004 37 0 1 CS000000000000000002 20
分析:主要进行输入数据的处理。用到c_str()函数。1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 #include <string> 7 using namespace std; 8 9 typedef struct{ 10 string id; 11 int score; 12 } candidate; 13 14 bool cmp(candidate a, candidate b){ 15 if(a.score != b.score) 16 return a.score > b.score; 17 else 18 return a.id < b.id; 19 } 20 21 int main(){ 22 //N表示人数,M表示考题数,G分数线 23 int N, M, G, m, num, sum; 24 int i, j; 25 string str; 26 int s[10]; 27 char id[21]; 28 candidate stu; 29 vector<candidate> v; 30 while(scanf("%d %d %d", &N, &M, &G)){ 31 if(N == 0) 32 break; 33 v.clear(); 34 int reach = 0; 35 for(i = 0; i < M; i++) 36 scanf("%d", &s[i]);//每题分数 37 for(i = 0; i < N; i++){ 38 scanf("%s %d", id, &m); 39 str = id; 40 sum = 0; 41 for(j = 0; j < m; j++){ 42 scanf("%d", &num); 43 sum += s[num - 1]; 44 } 45 if(sum >= G){ 46 reach++; 47 v.push_back(stu); 48 v[reach - 1].id = str; 49 v[reach - 1].score = sum; 50 } 51 } 52 sort(v.begin(), v.end(), cmp); 53 printf("%d\n", reach); 54 for(i = 0; i < v.size(); i++){ 55 printf("%s %d\n", v[i].id.c_str(), v[i].score);//c_str()函数 56 //cout << v[i].id << " " << v[i].score << endl; 57 } 58 } 59 return 0; 60 }
1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 #include <string> 5 using namespace std; 6 7 typedef struct{ 8 string id; 9 int score; 10 } candidate; 11 12 bool cmp(candidate a, candidate b){ 13 if(a.score != b.score) 14 return a.score > b.score; 15 else 16 return a.id < b.id; 17 } 18 19 int main(){ 20 //N表示人数,M表示考题数,G分数线 21 int N, M, G, m, num, sum; 22 int i, j; 23 string str; 24 int s[10]; 25 candidate stu; 26 vector<candidate> v; 27 while(cin >> N >> M >> G){ 28 if(N == 0) 29 break; 30 v.clear(); 31 int reach = 0; 32 for(i = 0; i < M; i++) 33 cin >> s[i];//每题分数 34 for(i = 0; i < N; i++){ 35 cin >> str >> m; 36 sum = 0; 37 for(j = 0; j < m; j++){ 38 cin >> num; 39 sum += s[num - 1]; 40 } 41 if(sum >= G){ 42 reach++; 43 v.push_back(stu);//这里一定要注意,先在容器中创造一个结构体空间,然后在赋值 44 v[reach - 1].id = str; 45 v[reach - 1].score = sum; 46 } 47 } 48 sort(v.begin(), v.end(), cmp); 49 cout << reach << endl; 50 for(i = 0; i < v.size(); i++){ 51 cout << v[i].id << " " << v[i].score << endl; 52 } 53 } 54 return 0; 55 }
总结:需要注意的是,vector容器是结构体类型的话,push_back()元素的方法