PAT(Basic Level) Practice : 1080 MOOC期终成绩 (25分)

1080 MOOC期终成绩 (25分)

参考:> https://blog.csdn.net/DoctorLDQ/article/details/86661835

测试点3超时

因为学号不是数字,因此不能用大数组做哈希表,直接用循环在vector中查找会导致第3个测试点超时。
因此使用map来通过学号直接查询vector的索引,时间复杂度log(N)

代码

#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
//scanf printf防止超时
#include <algorithm>
//vector的sort
#include <sstream>
//转换
using namespace std;

#include<iomanip>
//精度

#include<cmath>
//round四舍五入取整
#include <map>
class student
{
public:
    string name;
    int grade1;
    int mid;
    int final;
    int last;
    student()
    {
        name="";
        grade1=0;
        mid=-1;
        final=0;
        last=0;
    }
};

bool compare(student stu1,student stu2)
{
    if(stu1.last!=stu2.last)
    {
        return stu1.last>stu2.last;
    }else
    {
        return stu1.name.compare(stu2.name)<0;
    }
}


int main()
{
    int p,m,n;

    cin>>p>>m>>n;
    vector<student> stus;
    map<string,int> nameIndex;
    int count=0;
    for(int i=0;i<p;i++)
    {
        string name;
        int grade1;
        cin>>name>>grade1;
        if(grade1>=200)
        {
            student t;
            t.name=name;
            t.grade1=grade1;
            stus.push_back(t);
            count++;
            nameIndex[name]=count;

        }
    }


    for(int i=0;i<m;i++)
    {
        string name;
        int mid;
        cin>>name>>mid;

        if(nameIndex[name]>0)
        {
            int j=nameIndex[name]-1;
            stus[j].mid=mid;
        }

    }

    for(int i=0;i<n;i++)
    {
        string name;
        int final;
        cin>>name>>final;
        if(nameIndex[name]>0)
        {
            int j=nameIndex[name]-1;
            stus[j].final=final;
            if(final>=stus[j].mid)
            {
                stus[j].last=final;
            }else
            {
                stus[j].last=round(0.4*(double)stus[j].mid+0.6*(double)final);
            }
        }

    }
    sort(stus.begin(),stus.end(),compare);
    for(int i=0;i<stus.size();i++)
    {
        if(stus[i].last>=60)
        {
            cout<<stus[i].name<<" "<<stus[i].grade1<<" "<<stus[i].mid<<" ";
            cout<<stus[i].final<<" "<<stus[i].last<<endl;
        }

    }
    return 0;
}

posted @ 2020-09-30 22:16  韩天尊  阅读(120)  评论(0)    收藏  举报