代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct Student {
string id;
int de;
int cai;
int sum;
int rank;
} stu;
int compare(stu a, stu b) {
if(a.rank==b.rank) {
if(a.sum==b.sum) {
if(a.de==b.de) {
return a.id<b.id;
} else {
return a.de>b.de;
}
} else {
return a.sum>b.sum;
}
} else {
return a.rank<b.rank;
}
}
int main() {
int num, low, high;
cin>>num>>low>>high;
vector<stu> v;
for(int i=0; i<num; i++) {
stu s;
cin>>s.id>>s.de>>s.cai;
s.sum = s.de + s.cai;
if(s.de>=high && s.cai>=high) {
s.rank = 1;
} else if(s.de>=high && s.cai>=low) {
s.rank = 2;
} else if(s.de>=s.cai && s.cai>=low) {
s.rank = 3;
} else if(s.de>=low && s.cai>=low) {
s.rank = 4;
} else {
s.rank = 0;
}
if(s.rank>0) {
v.push_back(s);
}
}
sort(v.begin(), v.end(), compare);
cout<<v.size()<<endl;
for(int i=0; i<v.size(); i++) {
cout<<v[i].id<<" "<<v[i].de<<" "<<v[i].cai<<endl;
}
return 0;
}
注解
(1)复杂结构体排序。要会写排序条件:升序用小于号,降序用大于号。(包括字符串也是,字符串不要用compare函数,否则会出现段错误!)
(2)分几类分别排序,这是数据结构里可增加一个rank字段,相当于先按rank排序,再按题目给定的条件排序。用一个vector记录并排序,不要把不同的类别用不同的vector分别排序,多次排序耗时高,会造成超时!
(3)结构体定义语法:
typedef struct Student {
string id;
int de;
int cai;
int sum;
int rank;
} stu;