PAT甲级1055.

目录

A1055

题目

样例

输入:

12 4
Zoe_Bill 35 2333
Bob_Volk 24 5888
Anny_Cin 95 999999
Williams 30 -22
Cindy 76 76000
Alice 18 88888
Joe_Mike 32 3222
Michael 5 300000
Rosemary 40 5888
Dobby 24 5888
Billy 24 5888
Nobody 5 0
4 15 45
4 30 35
4 5 95
1 45 50

输出:

Case #1:
Alice 18 88888
Billy 24 5888
Bob_Volk 24 5888
Dobby 24 5888
Case #2:
Joe_Mike 32 3222
Zoe_Bill 35 2333
Williams 30 -22
Case #3:
Anny_Cin 95 999999
Michael 5 300000
Alice 18 88888
Cindy 76 76000
Case #4:
None

思路和坑点

  排序,然后按照要求查找并输出,为了不超时,尽可能的少使用stl,并且快速排序使用排下标的方式实现。

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef struct node{
    string id;
    int age,w;
}Node;
Node v[100005];
int sid[100005];
bool cmp(int i,int j){
    if(v[i].w!=v[j].w) return v[i].w>v[j].w;
    else if(v[i].age!=v[j].age) return v[i].age<v[j].age;
    else return v[i].id<v[j].id;
}
int main(void){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt","r",stdin);
#endif
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++){
        sid[i]=i;
        cin>>v[i].id;
        scanf("%d%d",&v[i].age,&v[i].w);
    }
    sort(sid,sid+n,cmp);
    for(int i=1;i<=k;i++){
        printf("Case #%d:\n",i);
        int num,st,ed,cnt=0;
        scanf("%d%d%d",&num,&st,&ed);
        for(int j=0;j<n;j++){
            int index=sid[j];
            if(v[index].age>=st&&v[index].age<=ed){
                cnt++;
                printf("%s %d %d\n",v[index].id.c_str(),v[index].age,v[index].w);
            }
            if(cnt==num) break;
        }
        if(cnt==0) puts("None");
    }
    return 0;
}