#include<cstdio>
#include<cstring>
#include<algorithm> // STL
using namespace std; //使用sort()函数必须加上
const int MAXN = 100010;
struct TH{
char name[15];
int age;
int money;
}th[MAXN], valid[MAXN];
int Age[MAXN] = {0}; //某年龄人数,下标代表人数
bool cmp(TH a, TH b){
if(a.money != b.money) return a.money > b.money; //按照财富值排序,从大到小
else if(a.age != b.age) return a.age < b.age; //按年龄从小到大排序
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", th[i].name, &th[i].age, &th[i].money);
}
sort(th, th + n, cmp); //排序
int validNum = 0; //存放在valid数组中的人数
for(int i = 0; i < n; i++){
if(Age[th[i].age] < 100){ //年龄th[i].age的人数小于100
Age[th[i].age]++; //年龄th[i].age的人数加1
valid[validNum++] = th[i]; //将th[i]存入新数组
}
}
int start, end, number; //区间,前number个人
for(int i = 1; i <= k; i++){
scanf("%d %d %d", &number, &start, &end);
printf("Case #%d:\n", i);
int printNum = 0; //已经输出的人
for(int j = 0; j < validNum && printNum < number; j++){
if(valid[j].age >= start && valid[j].age <= end){
/*
题目中说明总人数 n < 10的五次方,排序完成后必须预处理
保留前 M(≤100)个人的数据(存入另外的一个数组(有效数组valid))
可以减少复杂度,如果不做预处理,以下两条测试用例会超时
1 答案正确 107 ms 3940 KB
2 答案正确 114 ms 4608 KB
*/
printf("%s %d %d\n", valid[j].name, valid[j].age, valid[j].money);
printNum++;
}
}
if(printNum == 0){
printf("None\n");
}
}
return 0;
}
原文地址:https://www.cnblogs.com/zjsaipplp/p/10425249.html
时间: 2024-11-03 03:28:42