フォーブス誌は毎年、世界の裕福な人々の年間ランキングに基づいて、億万長者のリストを公開しています。今、あなたはこの仕事をシミュレートするが、唯一の年齢層の特定の範囲の人々に集中することになっています。それは純資産の与えられた、あります 人々は、あなたが見つけなければなりません 年齢の与えられた範囲で最も裕福な人々 。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。それぞれのケースについて、最初の行には2つの正の整数が含まれています。
-人の総数は、と
-クエリの数。それから
行はそれぞれの名前(スペースなしなし以上8文字以内の文字列)、年齢((0、200]の整数)、および純資産(整数でが含まれ、従っ
人の)。最後にあります
クエリの行は、それぞれ3つの正の整数が含まれています。
-最大出力の数、および[Amin
、Amax
]年齢の範囲です。行のすべての数字は、スペースで区切られます。
出力仕様:
ライン内の各クエリ、最初の印刷のためにCase #X
:X
1、出力から始まるクエリ数であります
の範囲の年齢で最も裕福な人々 [Amin
、Amax
]。各個人の情報は形式で、行を占めています
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");
}
}