您的位置:首页 > 其它

PAT1055___排序神题

2013-10-12 21:45 162 查看
题目意思比较简单,按财富,年龄,姓名来排序

看似挺普通的,但被坑了20多次TLE

首先排序只要一次,就是按题目规定的进行排序

然后在查询的时候,不是从头扫到尾看是否符合年龄的限制,而是记录这个年龄组在数组中的起始结束位置是多少,AC

#include<stdio.h>
#include<iostream>
#include<queue>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;

struct data{
char name[19];
int age;
int worth;
}s[100099];
int ageFrom[209],ageEnd[209];

int cmp(data x,data y){
if(x.worth==y.worth)
if(x.age==y.age)
return strcmp(x.name,y.name)<0;
else
return x.age<y.age;
else
return x.worth>y.worth;
}

int main()
{
int n,m;
scanf("%d%d",&n,&m);{
data temp;
int i;
for(i=0;i<=200;i++){
ageFrom[i]=-1;
ageEnd[i]=-1;
}
for(i=1;i<=n;i++){
scanf("%s",s[i].name);
scanf("%d%d",&s[i].age,&s[i].worth);
}
sort(&s[1],&s[1+n],cmp);

for(i=1;i<=n;i++){
if(ageFrom[s[i].age]==-1){
ageFrom[s[i].age]=i;
}
ageEnd[s[i].age]=i;
}

int j,k;
for(i=1;i<=m;i++){
printf("Case #%d:\n",i);
int size,ll,rr,add=0,first=9999999,end=0;
scanf("%d%d%d",&size,&ll,&rr);
for(k=ll;k<=rr;k++){
first=min(first,ageFrom[k]);
end=max(end,ageEnd[k]);
}

for(k=first;k<=end;k++){
if(s[k].age>=ll&&s[k].age<=rr){
printf("%s %d %d\n",s[k].name,s[k].age,s[k].worth);
add++;
if(add==size)break;
}
}
if(add==0)printf("None\n");
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: