#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 100010
struct person{
char name[10];
int age;
int worth;
}pe[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 main()
{
int m,n;
//int t,ma,mi;
scanf("%d %d",&m,&n);
for(int i=0;i<m;i++)
{
scanf("%s %d %d",pe[i].name,&pe[i].age,&pe[i].worth);
}
sort(pe,pe+m,cmp);
for(int i=0;i<n;i++)
{
int f=0;
int t,ma,mi;
scanf("%d %d %d",&t,&mi,&ma);
printf("Case #%d:\n",i+1);
for(int j=0;j<m&&t;j++)//需要预处理,不然会超时
{
if(pe[j].age>=mi&&pe[j].age<=ma)
{
printf("%s %d %d\n",pe[j].name,pe[j].age,pe[j].worth);
t--;
f=1;
}
}
if(f==0)
{
printf("None\n");
}
}
return 0;
}
另一种方法,也要预处理
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 100010
int Age[maxn]={0};//某年龄的人数
struct person{
char name[10];
int age;
int worth;
}pe[100010],pp[100010];
bool cmp(person a,person b)
{
int s=strcmp(a.name,b.name);
if(a.worth!=b.worth)
return a.worth>b.worth;
else if(a.age!=b.age)
return a.age<b.age;
return s<0;
}
int main()
{
int m,n;
int t,ma,mi;
scanf("%d %d",&m,&n);
for(int i=0;i<m;i++)
{
scanf("%s %d %d",pe[i].name,&pe[i].age,&pe[i].worth);
}
sort(pe,pe+m,cmp);
int validNum=0;//存放到valid数组中的人数
for(int i=0;i<m;i++)
{
if(Age[pe[i].age]<100)
{
Age[pe[i].age]++;
pp[validNum++]=pe[i];
}
}
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&t,&mi,&ma);
printf("Case #%d:\n",i);
int k=0;
for(int j=0;j<validNum&&k<t;j++)
{
if(pp[j].age>=mi&&pp[j].age<=ma)
{
printf("%s %d %d\n",pp[j].name,pp[j].age,pp[j].worth);
k++;
}
}
if(k==0)
{
printf("None\n");
}
}
return 0;
}