**整体思路:**先按照整体排序,然后通过年龄范围输出适当的。
注意: 必须进行预处理!!
- 注意到M的范围为100,将每个年龄中前100以内的存入到另一个数组中(因为某个年龄一百名以外的肯定不会被遍历到),后面的查询操作则直接在这个数组中进行。这个预处理会明显降低查询的复杂度。如果不进行处理则会超时。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct Person{
char name[10];
int age;
long long int worth;
}per[100010], valid[100010];
int Age[100010] = {
0};
bool cmp(Person a, Person b){
if(a.worth != b.worth){
return a.worth > b.worth;
} else if (a.age != b.age){
return a.age < b.age;
} else {
return strcmp(a.name, b.name) < 0;
}
}
int main(int argc, char** argv) {
int n, k;
cin >> n >> k;
int num;
int Amin;
int Amax;
int validNum = 0;
//输入
for(int i = 0; i < n; i++){
cin >> per[i].name >> per[i].age >> per[i].worth;
}
sort(per, per+n, cmp);
//预处理
for(int i = 0; i < n; i++){
if(Age[per[i].age] < 100){
Age[per[i].age]++;
valid[validNum++] = per[i];
}
}
for(int i = 0; i < k; i++){
cin >> num >> Amin >> Amax;
int printNum = 0;
cout << "Case #" << (i+1) << ":" << endl;
for(int j = 0; j < n && printNum < num; j++){
if(valid[j].age >= Amin && valid[j].age <= Amax){
cout << valid[j].name << " " << valid[j].age << " " << valid[j].worth << endl;
printNum++;
}
}
if(printNum == 0){
cout << "None" << endl;
}
}
return 0;
}