【PAT甲级】1055 The Worlds Richest (25分)

解题过程的小记录,如有错误欢迎指出。

难度:二星半(看着很简单的排序题却只有0.23的通过率是因为其中的运行超时问题)

题目分析

给出一堆人的信息包括姓名、年龄和财富,查询某年龄段最富有的人并按照一定的格式进行输出

注意点

测试点二的运行超时问题,主要是由N和M的差值过大导致,要通过对数据进行预处理和输入输出采用printf和scanf来进行解决,以后碰到这种数据量的题目运行超时可以借鉴这题

我的解题过程

思路

将数据进行输入后进行指定规则的排序,因为最多输出100人,可以输出的最短的年龄段是Amin==Amax,也就是只需要对每个岁数的前100进行查询即可,其它的根本不会有输出的机会,然后对新的数组进行查询输出

bug

题目就是简单的排序题,早早写完信心满满地提交才发现测试点二无法通过的问题(╯‵□′)╯︵┻━┻第一时间把所有输出的cout改为了printf但还是超时(╯‵□′)╯︵┻━┻然后看了晴神的解析,改为只取某岁数的前100后在进行查询输出,然还是超时(╯‵□′)╯︵┻━┻又参考了柳神代码发现,柳神这次抛弃了常用的string改用cstring了,于是考虑到了可能是刚开始输入的时候采用cin过于费时。采用cstring后改了一系列相关内容,比如结构体中string改为char的数组,输入的时候不需要带&,输出的时候删去.c_str(),进行比较的时候采用strcmp()进行比较。然后就过了万恶的测试点二,是没有想到这样一题还藏着这么大玄机的

代码

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

using namespace std;

struct person {
	char name[10];
	int age;
	int worth;
};

int comp1(person p1, person p2) {
	if (p1.worth != p2.worth) return p1.worth > p2.worth;
	else return p1.age != p2.age ? p1.age < p2.age : strcmp(p1.name, p2.name) < 0;
}

int main()
{
	int N, K;
	scanf("%d %d", &N, &K);
	vector<person> people(N), valid;
	int Age[205] = { 0 };
	for (int i = 0; i < N; i++) {
		//cin >> people[i].name >> people[i].age >> people[i].worth;  *****此处有大量的数据输入,不能采用cin
		scanf("%s %d %d", people[i].name, &people[i].age, &people[i].worth);
	}
	sort(people.begin(), people.end(), comp1);
	for (int i = 0; i < N; i++) {//**********此题的必要操作,缩小了query的查询范围
		if (Age[people[i].age] < 100) {
			valid.push_back(people[i]);
			Age[people[i].age]++;
		}
	}
	for (int i = 0; i < K; i++) {
		int M, Amin, Amax;
		//cin >> M >> Amin >> Amax;
		scanf("%d %d %d", &M, &Amin, &Amax);
		vector<person> query;
		printf("Case #%d:\n", i + 1);
		for (int j = 0; j < valid.size(); j++) {
			if (valid[j].age >= Amin&&valid[j].age <= Amax) {
				query.push_back(valid[j]);
			}
		}
		if (query.size() != 0) {
			//sort(query.begin(), query.end(), comp1);*******因为已经进行过排序所以不需要再进行浪费时间
			for (int j = 0; j < M&&j < query.size(); j++) {
				printf("%s %d %d\n", query[j].name, query[j].age, query[j].worth);
			}
		}
		else {
			printf("None\n");
		}
	}
    return 0;
}

dalao的代码

全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~

借鉴点

运行超时的话不但可以从输入输出的方式进行考虑,还可以从数据量的方面进行考虑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值