前言
正文
参考题解
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
/*
题意:从给出的n个人中选择特定年龄范围内[Ammin,Amax]的前M个最有钱的人。
排序规则:首先按照资产降序排序,资产相同则按照年龄升序排序,年龄相同,则按照姓名
字典序升序排序,题目保证不会出现资产,年龄,姓名均相同的记录
考虑到M<=100,故可以将每个年龄段中前100名以内的人都存到
一个新的数组中,然后后续的查询就在这个数组中进行就可以。
(避免超时,因为N规模是10^5)
*/
struct person{
char name[20];
int age,worth;
}p[100010],top[100010];
//排序规则
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 age[220];//age[i]表示年龄为i的人数
int main(){
int n,k,m,Amin,Amax;
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 count=0;//在某个年龄段中排名前100的人数
for(int i=0;i<n;i++){
if(age[p[i].age]<100){
age[p[i].age]++;
top[count++]=p[i];//将其存入新的数组中
}
}
//k次查询
for(int i=0;i<k;i++){
scanf("%d%d%d",&m,&Amin,&Amax);
printf("Case #%d:\n",i+1);
int Num=0;//输出的人数,即Num应不大于m
for(int j=0;j<count&&Num<m;j++){
if(top[j].age>=Amin&&top[j].age<=Amax){
printf("%s %d %d\n",top[j].name,top[j].age,top[j].worth);
Num++;
}
}
if(Num==0){//说明没有输出符合条件的人
printf("None\n");
}
}
return 0;
}