雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

PAT1055___排序神题

Posted on 2013-10-12 21:45  huhuuu  阅读(381)  评论(0编辑  收藏  举报

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

看似挺普通的,但被坑了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