本题考查的是:
把一个人的信息 放到结构体
考虑对结构体的分类处理和排序
核心考点是sort的第三个参数–比较函数的自定义;
sort (待比较 A,待比较 B,compare())
如果 A compare B ,函数返回值是true, 无论A B本身如何,就认为A小于B,把A放在B的前面
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
struct stu //信息的结构体
{
string str;
int v, t, sum;
int tag;
stu(string strt , int vt , int tt )
{
str = strt;
v = vt;
t = tt;
sum = vt + tt;
tag = 0;
} //构造函数 默认初始化 及 参数初始化表;
};
bool com(stu a,stu b) //自定义compare 函数
{
if (a.tag != b.tag) //分类不同时,档次高者在前
return a.tag < b.tag;
else if (a.sum != b.sum) //总分不同时,总分高的在前
return a.sum > b.sum;
else if (a.v != b.v) //德优先
return a.v > b.v;
else if (a.str != b.str) //都相等,只能比学号了
return a.str < b.str;
return false; //默认false
}
int main()
{
int num, low, high;
cin >> num >> low >> high;
string str0;
int v0, t0;
vector<stu> data;
for (int i = 0; i < num; i++)
{
cin >> str0 >> v0 >> t0;
stu s0(str0, v0, t0); //用构造函数,其实完全可以不用
if (v0 >= high && t0 >= high)
s0.tag = 1;
else if (v0 >= high && t0 >= low && t0 < high)
s0.tag = 2;
else if (v0 >= low && v0 < high&&t0 >= low && t0 < high&&v0 >= t0)
s0.tag = 3;
else if (v0 >= low && t0 >= low)
s0.tag = 4;
else s0.tag = 5; //处理分类问题
if (s0.tag >= 1 && s0.tag <= 4)
data.push_back(s0);
}
sort(data.begin(), data.end(), com); //排序
cout << data.size();
for (auto i : data) // for each
cout << endl << i.str << " " << i.v << " " << i.t;
return 0;
}