题目大意;
给出N个人的姓名,年龄以及其拥有的财富值,然后进行K次查询,每次查询年龄范围在[AgeL,AgeR]的财富值从大到小的M个人的信息,
如果财富值相同,则年龄小的优先,如果年龄也相同,则姓名的字典序小的优先。
思路:
1.定义结构体存储题目中要求的信息,年龄姓名财富
2.cmp函数,按题目要求定义
3.由于M的范围为[0,100],即对于每一个年龄段的财富排名在100名之后的永远不会被输出,
可以进行预处理,建立新的结构体数组,只存储每个年龄段的前100名。不这样处理有的case会超时。
4.按照题目要求进行K次查询,输出在给定年龄区间内的m人的信息。
AC代码:
//PAT_A 1055
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int Age[maxn] = { 0 };//某个年龄的人数
struct Person {
int age, worths;
char name[10];
}ps[maxn], valid[maxn];
bool cmp(Person a, Person b) {
if (a.worths != b.worths)return a.worths > b.worths;
else if (a.age != b.age)return a.age < b.age;
else {
int s = strcmp(a.name, b.name);
if (s != 0)return s < 0;
}
}
int main() {
int n, k;
(void)scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++) {
(void)scanf("%s%d%d", ps[i].name, &ps[i].age, &ps[i].worths);
}
sort(ps, ps + n, cmp);
int vaildName = 0;
for (int i = 0; i < n; i++) {
if (Age[ps[i].age] < 100) {
Age[ps[i].age]++;
valid[vaildName++] = ps[i];//ps[i]加入到新数组中
}
}
int m, ageL, ageR;
for (int i = 1; i <= k; i++) {
(void)scanf("%d%d%d", &m, &ageL, &ageR);
printf("Case #%d:\n", i);
int printNum = 0;
for (int j = 0; j < vaildName && printNum < m; j++) {
if (valid[j].age >= ageL && valid[j].age <= ageR) {
printf("%s %d %d\n", valid[j].name, valid[j].age, valid[j].worths);
printNum++;
}
}
if (printNum == 0) {
printf("None\n");
}
}
return 0;
}