自己写的代码有一个测试点超时,借鉴了以为仁兄的代码,在对结构体排序后,还要进行剪枝,去掉年龄出现100次以上的,编程真的是细节很重要,小菜我还要多多学习啊!
下面贴上AC代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct person{
char name[10];
int age;
int net_worth;
}p[100001];
bool cmp(const person& a,const person& b)
{
if(a.net_worth>b.net_worth) return true;
else if(a.net_worth==b.net_worth)
{
if(a.age<b.age) return true;
else if(a.age==b.age)
{
int t=strcmp(a.name,b.name);
if(t<0) return true;
else return false;
}
else return false;
}
else return false;
}
int main()
{
int n,k,m,amin,amax;
//freopen("E:\\个人程序\\机试练习\\pat练习\\input.txt","r",stdin);
//freopen("E:\\个人程序\\机试练习\\pat练习\\output.txt","w",stdout);
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%s%d%d",p[i].name,&p[i].age,&p[i].net_worth);
}
int count=1;
sort(p,p+n,cmp);
int ageCount[201]={0};
int filternum=0;
int *filter=new int[n];
for(int i=0;i<n;i++)
{
if(++ageCount[p[i].age]<101)
{
filter[filternum++]=i;
}
}
while(count<=k)
{
printf("Case #%d:\n",count);
scanf("%d%d%d",&m,&amin,&amax);
int cnt=0;
for(int i=0;i<filternum;i++)
{
int index=filter[i];
if(p[index].age>=amin&&p[index].age<=amax)
{
printf("%s %d %d\n",p[index].name,p[index].age,p[index].net_worth);
cnt++;
}
if(cnt==m) break;
}
if(cnt==0) printf("None\n");
count++;
}
return 0;
}