1055 The World's Richest (25分)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

错误示例

对全部数据先按年龄排序,查询时将要求的年龄段内的所有人放到一个优先队列中,再根据给定的输出人数,从优先队列中取出排在优先队列队首的人。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
struct node {
	char name[9];
	int age, netWorth;
	friend bool operator < (node n1, node n2) {
		if (n1.netWorth != n2.netWorth)
			return n1.netWorth < n2.netWorth;
		else if (n1.age != n2.age)
			return n1.age > n2.age;
		else return strcmp(n2.name, n1.name) < 0;
	}
}people[100000];
bool cmp1(node n1, node n2) {
	return n1.age < n2.age;
}
int peopleNum, queryNum;
int main() {
	scanf("%d %d", &peopleNum, &queryNum);
	for (int i = 0;i < peopleNum;i++) {
		scanf("%s %d %d", &people[i].name, &people[i].age, &people[i].netWorth);
	}
	sort(people, people + peopleNum, cmp1);	//按年龄排序
	for (int i = 0;i < queryNum;i++) {
		priority_queue<node> heap;
		int num, minAge, maxAge;
		scanf("%d %d %d", &num, &minAge, &maxAge);
		int left = 0, right = peopleNum - 1;
		while (left < right) {	//二分查找起始位置
			int mid = (left + right) / 2;
			if (people[mid].age >= minAge) {
				right = mid;
			}
			else if (people[mid].age < minAge) {
				left = mid + 1;
			}
		}
		int index = left;
		while (index < peopleNum && people[index].age <= maxAge && people[index].age >= minAge) {
			heap.push(people[index]);
			index++;
		}
		printf("Case #%d:\n", i + 1);
		if (heap.empty()) {
			printf("None\n");
		}
		else {
			int count = 0;
			while (count < num && !heap.empty()) {
				node temp = heap.top();
				heap.pop();
				printf("%s %d %d\n", temp.name, temp.age, temp.netWorth);
				count++;
			}
		}
	}
}

因为总人数很多,高达10^5,而每次查询最多只要100个人。此外,查询要求的年龄范围可能很大,导致优先队列中数据的规模很大,所以不适合根据年龄对数据进行排序。
应该对所有数据根据资产排序。新开一个数组,对于同一个年龄的人,将100名开外的人剔除,即对于每个年龄,只保留资产前100的人。在处理查询时,从头开始遍历这个新数组,遇到符合年龄要求的数据就将它加入到结果集中。

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
struct node {
	char name[9];
	int age, netWorth;
}people[100000];
vector<node> top100EveryAge;
int book[201] = { 0 };
bool cmp(node n1, node n2) {
	if (n1.netWorth != n2.netWorth)
		return n1.netWorth > n2.netWorth;
	else if (n1.age != n2.age)
		return n1.age < n2.age;
	else return strcmp(n2.name, n1.name) > 0;
}
int peopleNum, queryNum;
int main() {
	scanf("%d %d", &peopleNum, &queryNum);
	for (int i = 0;i < peopleNum;i++) {
		scanf("%s %d %d", &people[i].name, &people[i].age, &people[i].netWorth);
	}
	sort(people, people + peopleNum, cmp);	//按资产排序
	for (int i = 0;i < peopleNum;i++) {
		int age = people[i].age;
		if (book[age] < 100) {
			top100EveryAge.push_back(people[i]);
			book[age]++;
		}
	}
	for (int i = 0;i < queryNum;i++) {
		vector<node> v;
		int outputNum, minAge, maxAge;
		scanf("%d %d %d", &outputNum, &minAge, &maxAge);
		int count = 0, index = 0;
		while (count < outputNum && index < top100EveryAge.size()) {
			int age = top100EveryAge[index].age;
			if (age >= minAge && age <= maxAge) {
				v.push_back(top100EveryAge[index]);
			}
			index++;
		}
		printf("Case #%d:\n", i + 1);
		if (v.empty()) {
			printf("None\n");
		}
		else {
			int count = 0;
			while (count < outputNum && count < v.size()) {
				printf("%s %d %d\n", v[count].name, v[count].age, v[count].netWorth);
				count++;
			}
		}
	}
}
发布了61 篇原创文章 · 获赞 0 · 访问量 811

猜你喜欢

转载自blog.csdn.net/weixin_43116322/article/details/103945312