PAT A1055 The World's Richest
思路:本题需要预处理 valid 结构体数组,由于每次查询的人数 M <= 100,让每个年龄的前 100 人进入 valid 数组即可,否则本题在测试点 2 会超时。
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int MAXN = 100005;
int N, K;
typedef struct {
string name;
int age, worth;
} Info;
Info a[MAXN], valid[MAXN];
int Age[MAXN];
bool cmp(Info i1, Info i2) {
if(i1.worth != i2.worth) return i1.worth > i2.worth;
else if(i1.age != i2.age) return i1.age < i2.age;
return i1.name < i2.name;
}
int main() {
cin >> N >> K;
for(int i = 0; i < N; i++) {
cin >> a[i].name >> a[i].age >> a[i].worth;
}
sort(a, a + N, cmp);
int validNum = 0;
for(int i = 0; i < N; i++) {
if(Age[a[i].age] < 100) {
Age[a[i].age]++;
valid[validNum++] = a[i];
}
}
int M, AgeL, AgeR;
for(int q = 1; q <= K; q++) {
cin >> M >> AgeL >> AgeR;
cout << "Case #" << q << ":\n";
int printNum = 0;
for(int j = 0; j < validNum && printNum < M; j++) {
if(valid[j].age >= AgeL && valid[j].age <= AgeR) {
cout << valid[j].name << " " << valid[j].age << " " << valid[j].worth << endl;
printNum++;
}
}
if(printNum == 0) cout << "None\n";
}
return 0;
}