传送门
参考题解
#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; }