考虑自定义比较
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
struct man{
int id, talent, virtue;
man(int i, int t, int v) : id(i), talent(t), virtue(v){}
};
int n, l, h;
int level(man m){
if(m.talent >= h && m.virtue >= h) return 4;
else if(m.talent < h && m.virtue >= h) return 3;
else if(m.talent < h && m.virtue < h && m.virtue >= m.talent) return 2;
else return 1;
}
bool cmp(const man& m1, const man& m2){
int l1 = level(m1), l2 = level(m2);
int sum1 = m1.talent + m1.virtue, sum2 = m2.talent + m2.virtue;
return l1 > l2 || (l1 == l2 && sum1 > sum2)
|| (l1 == l2 && sum1 == sum2 && m1.virtue > m2.virtue)
|| (l1 == l2 && sum1 == sum2 && m1.virtue == m2.virtue && m1.id < m2.id);
}
int main(){
scanf("%d%d%d", &n, &l, &h);
vector<man> men;
for(int i = 0; i < n; ++i){
int id, talent, virtue;
scanf("%d%d%d", &id, &virtue, &talent);
if(talent >= l && virtue >= l){
men.emplace_back(id, talent, virtue);
}
}
sort(begin(men), end(men), cmp);
printf("%d\n", (int)men.size());
for(auto& m : men){
printf("%08d %d %d\n", m.id, m.virtue, m.talent);
}
return 0;
}