unordered_map(整合信息)+vector(排序)
难点
- 分块输入学生信息(用map整合)
- 整合信息后需要对信息处理、对学生排序(vector)
相关数据结构
- 用 map[HTML_REMOVED]存储姓名-学生,用于整合每个学生的信息
- 用 vector[HTML_REMOVED] 来对student进行排序,用于输出时按照成绩由高到低、同分按姓名由小到大的方式
- 注意:这里的student里也有姓名这一成员
Tricks
- 结构体初始化的方法:
构造函数初始化
结构体可以封装函数
关于map排序
如果想直接对Map排序,对map排序其实就是把map内容复制到vector中然后再排序
map排序参考
C++ 代码
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<vector>
#include<math.h>
using namespace std;
int p,m,f;
struct student{
string name;
int gp,gm,gf,sum;
student()
{
gp=gm=gf=-1;
sum=0;
}
void calc()
{
if(gf>=gm) sum=gf;
else sum=round(gm*0.4+gf*0.6);
}
};
bool cmp(student &x,student &y)
{
if(x.sum!=y.sum) return x.sum>y.sum;
else return x.name<y.name;
}
unordered_map<string,student> stu;
int main()
{
cin>>p>>m>>f;
string name;
int x;
for(int i=0;i<p;i++)
{
cin>>name>>x;
stu[name].name=name;
stu[name].gp=x;
}
for(int i=0;i<m;i++)
{
cin>>name>>x;
stu[name].name=name;
stu[name].gm=x;
}
for(int i=0;i<f;i++)
{
cin>>name>>x;
stu[name].name=name;
stu[name].gf=x;
}
vector<student> order_stu;
for(auto s:stu)
{
student temp=s.second;
temp.calc();//计算总成绩
if(temp.gp>=200 && temp.sum>=60) order_stu.push_back(temp);
}
sort(order_stu.begin(),order_stu.end(),cmp);
for (auto s : order_stu)
cout << s.name << ' ' << s.gp << ' ' << s.gm << ' ' << s.gf << ' ' << s.sum << endl;
return 0;
}