<pre name="code" class="plain">对每个年龄人数进行控制减少遍历的范围 极大降低时间复杂度<pre name="code" class="cpp">
#pragma warning (disable:4786)
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int MAXN=100005;
int m,n;
int num,Min,Max;
struct people
{
string name;
int age,money;
};
people TT[MAXN],Valid[MAXN];
int Age[MAXN];
int Validcnt;
bool cmp(people a,people b)
{
if(a.money!=b.money)
return a.money>b.money;
else if(a.age!=b.age)
return a.age<b.age;
else
return a.name<b.name;
}
void output(int cases)
{
int cnt=0;
printf("Case #%d:\n",cases);
for(int i=0;i<Validcnt && cnt<num;i++)
{
if(Valid[i].age>=Min && Valid[i].age<=Max)
{
printf("%s %d %d\n",Valid[i].name.c_str(),Valid[i].age,Valid[i].money);
cnt++;
}
}
if(cnt==0)
printf("None\n");
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int i;
for(i=0;i<n;i++)
{
char name[1000];
scanf("%s",name);
scanf("%d",&TT[i].age);
scanf("%d",&TT[i].money);
TT[i].name=name;
}
sort(TT,TT+n,cmp);
//排序后对人进行筛选,每个年龄只取前100名
Validcnt=0;
for(i=0;i<n;i++)
{
if(Age[TT[i].age]<100)
{
Age[TT[i].age]++;
Valid[Validcnt++]=TT[i];
}
}
for(i=0;i<m;i++)
{
scanf("%d\n",&num);
scanf("%d",&Min);
scanf("%d",&Max);
output(i+1);
}
}
return 0;
}