PAT1055___排序神题

题目意思比较简单,按财富,年龄,姓名来排序

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

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

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

PAT1055___排序神题
#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

 

你可能感兴趣的:(pat)