关键:预处理,注意到M的范围只有100,排序后重开一个数组记录在该年龄前一百的记录,从而数据量只有10000,而不是原来的100000,启示我们优化可以从数据量入手,比如这里年龄只有0到100,每个年龄的数据量最多100从而找到优化的地方
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct Student{
char name[10];
int age,worth;
}stu[100010],valid[100010];
bool cmp(Student a,Student 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[100010];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
scanf("%s %d%d",stu[i].name,&stu[i].age,&stu[i].worth);
}
sort(stu,stu+n,cmp);
int validNum=0;
for(int i=0;i<n;i++){
if(Age[stu[i].age]<100){
valid[validNum++]=stu[i];
Age[stu[i].age]++;
}
}
for(int i=0;i<m;i++){
int num,low,high;
cin>>num>>low>>high;
printf("Case #%d:\n",i+1);
int printNum=0;
for(int j=0;j<validNum && printNum<num;j++){
if(valid[j].age<=high && valid[j].age>=low){
printf("%s %d %d\n",valid[j].name,valid[j].age,valid[j].worth);
printNum++;
}
}
if(printNum==0) cout<<"None"<<endl;
}
return 0;
}