解题思路
数据依照财富水平排序。
由于题目给定了最大输出M为100,就可以对数据预处理,将每个年龄财富水平前100另外保存,因为100名之后的人永远不会输出。
(考虑这种情况,共有200人,其中199人年龄39,另一个年龄50,其中198个39和另一个50的财富水平相当,余下的39财富较低,有可能会有40~50年龄的查询,这时就要对每个年龄都记录其前100名,而不是总共记录100名。)
查询时,查询第二个数组,此时进行遍历即可。
AC代码
// n个人中,找出给定年龄范围内的M个最富有的人
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 100010, maxk = 1010;
int Age[220] = {0};
struct person{
char name[9];
int age, worth;
}p[maxn], p1[110];
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 n, k;
scanf("%d%d", &n, &k);
for(int i = 0; i < n; i++){
scanf("%s%d%d", p[i].name, &p[i].age, &p[i].worth);
}
sort(p, p+n, cmp);
int validnum = 0;
for(int i = 0; i < n; i++){
if(Age[p[i].age] < 100){
Age[p[i].age]++;
p1[validnum++] = p[i];
}
}
int num = 0, low = 0, high = 0;
for(int i = 1; i <= k; i++){
scanf("%d%d%d", &num, &low, &high);
printf("Case #%d:\n", i);
int printnum = 0;
for(int j = 0; j < validnum && printnum < num; j++){
if(p1[j].age >= low && p1[j].age <= high){
printf("%s %d %d\n", p1[j].name, p1[j].age, p1[j].worth);
printnum++;
}
}
if(printnum == 0)
printf("None\n");
}
return 0;
}