PAT 甲级 A1055 (2019/02/17)

#include<cstdio>
#include<cstring>
#include<algorithm>         // STL 
using namespace std;        //使用sort()函数必须加上 
const int MAXN = 100010;
struct TH{
    char name[15];
    int age;
    int money;
}th[MAXN], valid[MAXN];
int Age[MAXN] = {0};  //某年龄人数,下标代表人数 
bool cmp(TH a, TH b){
    if(a.money != b.money) return a.money > b.money;    //按照财富值排序,从大到小 
    else if(a.age != b.age) return a.age < b.age;       //按年龄从小到大排序 
    return strcmp(a.name, b.name) < 0;                  //按姓名字典序号从小到大排序
}
int main(){
    int n, k; //区间
    scanf("%d %d", &n, &k);     //总人数,查询次数 
    for(int  i = 0; i < n; i++){
        scanf("%s %d %d", th[i].name, &th[i].age, &th[i].money);     
    }
    sort(th, th + n, cmp);      //排序 
    int validNum = 0;           //存放在valid数组中的人数 
    for(int  i = 0; i < n; i++){
        if(Age[th[i].age] < 100){           //年龄th[i].age的人数小于100 
            Age[th[i].age]++;               //年龄th[i].age的人数加1 
            valid[validNum++] = th[i];      //将th[i]存入新数组 
        }
    }
    int start, end, number;             //区间,前number个人 
    for(int  i = 1; i <= k; i++){
        scanf("%d %d %d", &number, &start, &end);
        printf("Case #%d:\n", i);
        int printNum = 0;               //已经输出的人 
        for(int j = 0; j < validNum && printNum < number; j++){
            if(valid[j].age >= start && valid[j].age <= end){
                /*
                    题目中说明总人数 n < 10的五次方,排序完成后必须预处理
                保留前 M(≤100)个人的数据(存入另外的一个数组(有效数组valid))
                可以减少复杂度,如果不做预处理,以下两条测试用例会超时 
                    1   答案正确    107 ms  3940 KB
                    2   答案正确    114 ms  4608 KB 
                */ 
                printf("%s %d %d\n", valid[j].name, valid[j].age, valid[j].money);
                printNum++;
            }
        }
        if(printNum == 0){
            printf("None\n");
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zjsaipplp/p/10425249.html
今日推荐