[PAT-A 1055]The World's Richest

在这里插入图片描述
在这里插入图片描述
题目大意;
给出N个人的姓名,年龄以及其拥有的财富值,然后进行K次查询,每次查询年龄范围在[AgeL,AgeR]的财富值从大到小的M个人的信息,
如果财富值相同,则年龄小的优先,如果年龄也相同,则姓名的字典序小的优先。

思路:
1.定义结构体存储题目中要求的信息,年龄姓名财富
2.cmp函数,按题目要求定义
3.由于M的范围为[0,100],即对于每一个年龄段的财富排名在100名之后的永远不会被输出,
可以进行预处理,建立新的结构体数组,只存储每个年龄段的前100名。不这样处理有的case会超时。
4.按照题目要求进行K次查询,输出在给定年龄区间内的m人的信息。

AC代码:

//PAT_A 1055
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int Age[maxn] = { 0 };//某个年龄的人数
struct  Person {
	int age, worths;
	char name[10];
}ps[maxn], valid[maxn];
bool cmp(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;
	else {
		int s = strcmp(a.name, b.name);
		if (s != 0)return s < 0;
	}
}
int main() {
	int n, k;
	(void)scanf("%d%d", &n, &k);
	for (int i = 0; i < n; i++) {
		(void)scanf("%s%d%d", ps[i].name, &ps[i].age, &ps[i].worths);
	}
	sort(ps, ps + n, cmp);
	int vaildName = 0;
	for (int i = 0; i < n; i++) {
		if (Age[ps[i].age] < 100) {
			Age[ps[i].age]++;
			valid[vaildName++] = ps[i];//ps[i]加入到新数组中
		}
	}
	int m, ageL, ageR;
	for (int i = 1; i <= k; i++) {
		(void)scanf("%d%d%d", &m, &ageL, &ageR);
		printf("Case #%d:\n", i);
		int printNum = 0;
		for (int j = 0; j < vaildName && printNum < m; j++) {
			if (valid[j].age >= ageL && valid[j].age <= ageR) {
				printf("%s %d %d\n", valid[j].name, valid[j].age, valid[j].worths);
				printNum++;
			}
		}
		if (printNum == 0) {
			printf("None\n");
		}
	}
	return 0;
}
发布了101 篇原创文章 · 获赞 1 · 访问量 2983

猜你喜欢

转载自blog.csdn.net/weixin_44699689/article/details/104166701