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;
}