Java
import java.io.*;
import java.util.*;
public class Main {
static final int N = 100010;
static int n, L, H; // L: 最低标准 H: 划分线
static class Person implements Comparable<Person> {
int id, virtue, talent, total; // virtue: 德,talent: 才
public Person(int id, int virtue, int talent) {
this.id = id;
this.virtue = virtue;
this.talent = talent;
this.total = virtue + talent;
}
@Override
public int compareTo(Person t) {
if (this.total != t.total) {
return t.total - this.total;
} else if (this.virtue != t.virtue) {
return t.virtue - this.virtue;
} else {
return this.id - t.id;
}
}
}
static List<Person>[] level = new List[4]; // 0:全过线,1:才不过德过,2:都不过线但才胜德,3:else
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
H = Integer.parseInt(st.nextToken());
for (int i = 0; i < 4; i++) {
level[i] = new ArrayList<>();
}
for (int i = 0; i < n; ++i) {
st = new StringTokenizer(br.readLine());
int id = Integer.parseInt(st.nextToken());
int virtue = Integer.parseInt(st.nextToken());
int talent = Integer.parseInt(st.nextToken());
Person p = new Person(id, virtue, talent);
if (p.virtue >= L && p.talent >= L) {
if (p.virtue >= H && p.talent >= H) {
level[0].add(p);
} else if (p.virtue >= H) {
level[1].add(p);
} else if (p.talent < H && p.virtue >= p.talent) {
level[2].add(p);
} else {
level[3].add(p);
}
}
}
int num = 0;
for (int i = 0; i < 4; ++i) {
num += level[i].size();
Collections.sort(level[i]);
}
System.out.println(num);
for (int i = 0; i < 4; ++i) {
for (Person p : level[i]) {
System.out.printf("%08d %d %d\n", p.id, p.virtue, p.talent);
}
}
br.close();
}
}
C++
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 100010;
int n, L, H; // L: 最低标准, H: 划分线
struct Person {
int id, virtue, talent, total; // virtue: 德, talent: 才
bool operator<(const Person &t) const {
if (total != t.total) return total > t.total;
else if (virtue != t.virtue) return virtue > t.virtue;
else return id < t.id;
}
};
vector <Person> level[4]; // 0:全过线,1:才不过德过,2:都不过线但才胜德,3:else
int main() {
scanf("%d%d%d", &n, &L, &H);
for (int i = 0; i < n; ++i) {
Person p;
scanf("%d%d%d", &p.id, &p.virtue, &p.talent);
p.total = p.virtue + p.talent;
if (p.virtue >= L && p.talent >= L) {
if (p.virtue >= H && p.talent >= H)
level[0].push_back(p);
else if (p.virtue >= H && p.talent < H)
level[1].push_back(p);
else if (p.virtue < H && p.talent < H && p.virtue >= p.talent)
level[2].push_back(p);
else
level[3].push_back(p);
}
}
int num = 0;
for (int i = 0; i < 4; ++i) {
num += level[i].size();
sort(level[i].begin(), level[i].end());
}
printf("%d\n", num);
for (int i = 0; i < 4; ++i)
for (auto &p: level[i])
printf("%08d %d %d\n", p.id, p.virtue, p.talent);
return 0;
}