PAT A1055 The World's Richest (25)

解题思路

数据依照财富水平排序。
由于题目给定了最大输出M为100,就可以对数据预处理,将每个年龄财富水平前100另外保存,因为100名之后的人永远不会输出。
(考虑这种情况,共有200人,其中199人年龄39,另一个年龄50,其中198个39和另一个50的财富水平相当,余下的39财富较低,有可能会有40~50年龄的查询,这时就要对每个年龄都记录其前100名,而不是总共记录100名。)
查询时,查询第二个数组,此时进行遍历即可。

AC代码

// n个人中,找出给定年龄范围内的M个最富有的人 
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int maxn = 100010, maxk = 1010; 
int Age[220] = {0};
struct  person{
    char name[9];
    int age, worth;
}p[maxn], p1[110];
bool cmp(person a, person b){
    if(a.worth != b.worth)  return a.worth > b.worth;
    else if(a.age != b.age) return a.age < b.age;
    else                    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", p[i].name, &p[i].age, &p[i].worth);
    }
    sort(p, p+n, cmp);
    int validnum = 0;
    for(int i = 0; i < n; i++){
        if(Age[p[i].age] < 100){
            Age[p[i].age]++;
            p1[validnum++] = p[i];
        }
    }

    int num = 0, low = 0, high = 0;
    for(int i = 1; i <= k; i++){
        scanf("%d%d%d", &num, &low, &high);
        printf("Case #%d:\n", i);
        int printnum = 0;
        for(int j = 0; j < validnum && printnum < num; j++){
            if(p1[j].age >= low && p1[j].age <= high){
                printf("%s %d %d\n", p1[j].name, p1[j].age, p1[j].worth);
                printnum++;
            }
        }
        if(printnum == 0)
            printf("None\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值