题目意思比较简单,按财富,年龄,姓名来排序
看似挺普通的,但被坑了20多次TLE
首先排序只要一次,就是按题目规定的进行排序
然后在查询的时候,不是从头扫到尾看是否符合年龄的限制,而是记录这个年龄组在数组中的起始结束位置是多少,AC
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }