1. 程式人生 > >PAT-ADVANCED1055——The World's Richest

PAT-ADVANCED1055——The World's Richest

題目描述:

題目翻譯:

1055 世界首富

福布斯雜誌每年根據世界上最富有的人的年度排名釋出億萬富翁名單。 現在你需要模擬這項工作,但只關注一定年齡段的人。 也就是說,考慮到N個人的淨資產,你必須在他們年齡的特定範圍內找到M個最富有的人。

輸入格式:

每個輸入檔案包含一個測試用例。 對每個測試用例,第一行包含2個正整數:N(<= 10 ^ 5),代表總人數;K(<= 10 ^ 3),代表查詢數。 加下來N行,每行包含人名(一個不超過8個字元無空格字串),年齡((0,200]範圍內的整數)和淨資產([-10 ^ 6, 10 ^ 6]範圍內的整數)。 最後有K個查詢行,每行包含三個正整數:M(<= 100),最大輸出數,[Amin,Amax]是年齡範圍。 一行中的所有數字都用一個空格分隔。

輸出格式:

對於每個查詢,首先列印一行Case #X:其中X是從1開始的查詢號。然後輸出年齡在[Amin,Amax]範圍內的M個最富有的人。 每個人的資訊都以下述格式佔據一行:

Name Age Net_Worth

輸出必須按淨資產的非遞增順序排列。 如果有相同的淨資產值,那就按年齡非遞減排序。 如果淨資產和年齡相同,則按名稱的非遞減字母順序排列。 題目保證沒有兩個人的三條資訊是完全相同的。 如果找不到任何人,則輸出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

知識點:排序

思路:先對所有人按題目要求進行排序,再取相應年齡區間的人

時間複雜度是O(NlogN)。空間複雜度是O(N)。

C++程式碼:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>

using namespace std;

struct person{
	string name;
	int age;
	int worth;
	person(string _name, int _age, int _worth) : name(_name), age(_age), worth(_worth) {};
};

int N, K;
vector<person> people;

bool cmp(person p1, person p2);

int main(){
	cin >> N >> K;
	string name;
	int age, worth;
	for(int i = 0; i < N; i++){
		cin >> name >> age >> worth;
		people.push_back(person(name, age, worth));
	}
	sort(people.begin(), people.end(), cmp);
	int M, Amin, Amax, count;
	for(int i = 1; i <= K; i++){
		cin >> M >> Amin >> Amax;
		printf("Case #%d:\n", i);
		count = 0;
		for(int j = 0; j < people.size(); j++){
			if(count == M){
				break;
			}
			if(people[j].age >= Amin && people[j].age <= Amax){
				cout << people[j].name << " " << people[j].age << " " << people[j].worth << endl;
				count++;
			}
		}
		if(count == 0){
			printf("None\n");
		}
	} 
}

bool cmp(person p1, person p2){
	if(p1.worth == p2.worth){
		if(p1.age == p2.age){
			return p1.name.compare(p2.name) < 0;
		}else{
			return p1.age < p2.age;
		}
	}else{
		return p1.worth > p2.worth;
	}
}

C++解題報告: