PTA MOOC期终成绩

来源:互联网 发布:nb男鞋 知乎 编辑:程序博客网 时间:2024/05/16 06:45

对于在中国大学MOOC(http://www.icourse163.org/)学习“数据结构”课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作业分,然后总评获得不少于60分(满分100)。总评成绩的计算公式为 G = (G期中x 40% + G期末x 60%),如果 G期中 > G期末;否则总评 G 就是 G期末。这里 G期中 和 G期末 分别为学生的期中和期末成绩。

现在的问题是,每次考试都产生一张独立的成绩单。本题就请你编写程序,把不同的成绩单合为一张。

输入格式:

输入在第一行给出3个整数,分别是 P(做了在线编程作业的学生数)、M(参加了期中考试的学生数)、N(参加了期末考试的学生数)。每个数都不超过10000。

接下来有三块输入。第一块包含 P 个在线编程成绩 G编程;第二块包含 M 个期中考试成绩 G期中;第三块包含 N 个期末考试成绩 G期末。每个成绩占一行,格式为:学生学号 分数。其中学生学号为不超过20个字符的英文字母和数字;分数是非负整数(编程总分最高为900分,期中和期末的最高分为100分)。

输出格式:

打印出获得合格证书的学生名单。每个学生占一行,格式为:

学生学号 G编程 G期中 G期末 G

如果有的成绩不存在(例如某人没参加期中考试),则在相应的位置输出“-1”。输出顺序为按照总评分数(四舍五入精确到整数)递减。若有并列,则按学号递增。题目保证学号没有重复,且至少存在1个合格的学生。

输入样例:
6 6 701234 880a1903 199ydjh2 200wehu8 300dx86w 220missing 400ydhfu77 99wehu8 55ydjh2 98dx86w 88a1903 8601234 39ydhfu77 88a1903 6601234 58wehu8 84ydjh2 82missing 99dx86w 81
输出样例:
missing 400 -1 99 99ydjh2 200 98 82 88dx86w 220 88 81 84

wehu8 300 55 84 84

这个题其实算是个水题,纯考验代码逻辑和编码能力

比较坑的点是时间性能问题。

由于STL容器在进行增加元素的时候进行的是对 对象(结构体)的拷贝,所以在最初版本中set存储结构体时会超时,为了避免这种情况,使用指针代替结构体元素,会节省这种对结构体拷贝的时间。

#include <iostream>#include <cstdio>#include <string>#include <map>#include <set>using namespace std;struct Grade{    string name;    double G_program;    double G_mid;    double G_end;    double G_all;    Grade(){        G_program = -1;        G_mid = -1;        G_end = -1;        G_all = -1;    }};struct op{    bool operator () (const Grade* x,const Grade* y){        if(x ->G_all == y ->G_all){            return x ->name < y ->name;        }else{            return x ->G_all > y ->G_all;        }    }};map<string,Grade> students;set<Grade*,op> cache;int main(){    int p,m,n;    scanf("%d%d%d",&p,&m,&n);    int gra;    string name;    for(int i = 0; i < p; i ++){        cin >>name >>gra;        if(gra >= 200){            students[name].G_program = gra;            students[name].name = name;        }    }    for(int i = 0; i < m; i ++){        cin >>name >>gra;        if(students.count(name))            students[name].G_mid = gra;    }    for(int i = 0; i < n; i ++){        cin >>name >>gra;        if(students.count(name)){//如果没有相关的名字记录 -> 说明这个人已经不可能及格了            if(gra >= students[name].G_mid){//首先判断期末成绩比期中成绩要好的情况                if(gra >= 60){                    students[name].G_end = students[name].G_all = gra;//及格                    cache.insert(&students[name]);                }            }else{//期末成绩没有其中成绩好的情况                if(students[name].G_mid > 60){                    students[name].G_end = gra;                    students[name].G_all = (int)(0.4 * students[name].G_mid + 0.6 * students[name].G_end + 0.5);                    if(students[name].G_all >= 60)                        cache.insert(&students[name]);                }            }        }    }    for(set<Grade*,op> ::iterator it = cache.begin(); it != cache.end(); it ++)        cout << (*it) ->name <<" "<< (*it) ->G_program <<" "<< (*it) ->G_mid<<" "<< (*it) ->G_end <<" "<<(*it) ->G_all<<endl;    return 0;}


原创粉丝点击