PAT(上級レベル)実践1055ザ・世界最も豊かな(25ポイント)[ソート]

フォーブス誌は毎年、世界の裕福な人々の年間ランキングに基づいて、億万長者のリストを公開しています。今、あなたはこの仕事をシミュレートするが、唯一の年齢層の特定の範囲の人々に集中することになっています。それは純資産の与えられた、あります N N 人々は、あなたが見つけなければなりません M M 年齢の与えられた範囲で最も裕福な人々 。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。それぞれのケースについて、最初の行には2つの正の整数が含まれています。 N 1 0 5 N(≤10^ 5) -人の総数は、と K 1 0 3 K(≤10^ 3) -クエリの数。それから N N 行はそれぞれの名前(スペースなしなし以上8文字以内の文字列)、年齢((0、200]の整数)、および純資産(整数でが含まれ、従っ [ - 1 0 6 1 0 6 ] [-10 ^ 6,10 ^ 6] 人の)。最後にあります K K クエリの行は、それぞれ3つの正の整数が含まれています。 M 100 M(≤100) -最大出力の数、および[AminAmax]年齢の範囲です。行のすべての数字は、スペースで区切られます。

出力仕様:

ライン内の各クエリ、最初の印刷のためにCase #XX1、出力から始まるクエリ数であります M M の範囲の年齢で最も裕福な人々 [AminAmax]。各個人の情報は形式で、行を占めています

Name Age Net_Worth

出力は純資産の非昇順でなければなりません。場合等しいworthsがあり、それは年齢の非減少順でなければなりません。worthsと年齢の両方が同じである場合、出力は名前のアルファベット順に非減少でなければなりません。何の二人は、すべての3つの情報の同じ共有していないがあることが保証されています。場合には誰もが、出力は検出されませんでしたNone

サンプル入力:

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

問題の意味

Nは、個人の氏名、年齢と富を与えられました。Kは、完全なクエリに必要な年齢ならば、富は、順序を非減少に応じて、同じ年齢であれば、各クエリは、富の非リットルの並べ替えの要件に従って、Mの出力と年齢範囲の最大数は、ほとんどのM最高の個人的な富の年齢の範囲内で、必要な出力を提供しますまた、名前でソートノンドロップと同じ。

思考

なぜなら、すべての年齢を出力することができる前にアップMの富高い男にMは、問題の大きさを制限するだけでなく、100を超えることはありません。再びトラバースすべての並べ替えのために、各年齢の数を記録し、誰かが100に達した場合、年齢の数は無視することができますので、最初のステップは、これらの人々は、出力をスクリーニングすることができる置きます。

各クエリについて、人々が横断後、出力は年齢の条件を満たすことができ上映されています。

コード

#include <algorithm>
#include <cstdio>
#include <cstring>

using namespace std;
const int max_n = 100010;

int age[max_n];

struct Person {
    int age, worths;
    char name[10];
} ps[max_n];

int main() {
    int n, k;
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++)
        scanf("%s%d%d", ps[i].name, &ps[i].age, &ps[i].worths);

    sort(ps, ps + n,
         [](Person a, Person b) {
             if (a.worths != b.worths)
                 return a.worths > b.worths;
             else if (a.age != b.age)
                 return a.age < b.age;
             return strcmp(a.name, b.name) < 0;
         });

    int validCnt = 0;
    for (int i = 0; i < n; i++) {
        if (age[ps[i].age] < 100) {
            age[ps[i].age]++;
            ps[validCnt++] = ps[i];
        }
    }

    for (int i = 1; i <= k; i++) {
        int m, ageL, ageR, cnt = 0;
        scanf("%d%d%d", &m, &ageL, &ageR);
        printf("Case #%d:\n", i);
        for (int j = 0; j < validCnt && cnt < m; j++) {
            if (ps[j].age >= ageL && ps[j].age <= ageR) {
                printf("%s %d %d\n", ps[j].name, ps[j].age, ps[j].worths);
                cnt++;
            }
        }
        if (cnt == 0)
            printf("None\n");
    }
}
公開された184元の記事 ウォン称賛19 ビュー20000 +

おすすめ

転載: blog.csdn.net/Exupery_/article/details/104153598