A1055 The World‘s Richest (25 分)

**整体思路:**先按照整体排序,然后通过年龄范围输出适当的。

注意: 必须进行预处理!!

  • 注意到M的范围为100,将每个年龄中前100以内的存入到另一个数组中(因为某个年龄一百名以外的肯定不会被遍历到),后面的查询操作则直接在这个数组中进行。这个预处理会明显降低查询的复杂度。如果不进行处理则会超时。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct Person{
    
    
	char name[10];
	int age;
	long long int worth;
}per[100010], valid[100010];

int Age[100010] = {
    
    0};

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 argc, char** argv) {
    
    
	
	int n, k;
	cin >> n >> k;
	int num;
	int Amin;
	int Amax;
	
	int validNum = 0;
	//输入 
	for(int i = 0; i < n; i++){
    
    
		cin >> per[i].name >> per[i].age >> per[i].worth;
	}
	sort(per, per+n, cmp); 
	
	//预处理 
	for(int i = 0; i < n; i++){
    
    
		if(Age[per[i].age] < 100){
    
    
			Age[per[i].age]++;
			valid[validNum++] = per[i]; 
		}
	} 
	
	for(int i = 0; i < k; i++){
    
    
		cin >> num >> Amin >> Amax;
		int printNum = 0;
		cout << "Case #" << (i+1) << ":" << endl;
		for(int j = 0; j < n && printNum < num; j++){
    
    
			if(valid[j].age >= Amin && valid[j].age <= Amax){
    
    
				cout << valid[j].name << " " << valid[j].age << " " << valid[j].worth << endl;
				printNum++;
			}
		}
		if(printNum == 0){
    
    
			cout << "None" << endl;
		}
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/alovelypeach/article/details/114282353