PAT Advanced Level 1055

来源:互联网 发布:云宝网是网络传销吗 编辑:程序博客网 时间:2024/06/06 01:52

题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1055

思路分析:主要注意超时的问题,给出了输出限制,应该先按财富排序而非年龄排序,即使使用二分查找同样超时

代码如下:

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;struct richer{    char name[9];    int age;    int money;};int n,q;richer v[100001];int avail[100001];int ageRank[201];int cmpMon(richer A,richer B){    if(A.money!=B.money) return A.money>B.money;    else{        if(A.age!=B.age) return A.age<B.age;        else return strcmp(A.name,B.name)<0;    }}int main(){    //freopen("C:\\Users\\Devon\\Desktop\\input.txt","r",stdin);    memset(avail,0,sizeof(avail));    memset(ageRank,0,sizeof(ageRank));    scanf("%d%d",&n,&q);    for(int i=0;i<n;i++) scanf("%s%d%d",v[i].name,&v[i].age,&v[i].money);    sort(v,v+n,cmpMon);    int cur=0;    for(int i=0;i<n;i++){        ageRank[v[i].age]++;//用例2测试最大输出        if(ageRank[v[i].age]<101) avail[cur++]=i;    }    for(int i=0;i<q;i++){        printf("Case #%d:\n",i+1);        int num,young,old;        scanf("%d%d%d",&num,&young,&old);        int flag=1;        for(int j=0;j<cur;j++){            int x=avail[j];            if(v[x].age<=old&&v[x].age>=young) num--,flag=0,printf("%s %d %d\n",v[x].name,v[x].age,v[x].money);            if(num==0) break;        }        if(flag) printf("None\n");    }    return 0;}


0 0