前言

传送门

正文

参考题解

#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;
}