解题过程的小记录,如有错误欢迎指出。
难度:二星半(看着很简单的排序题却只有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的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
运行超时的话不但可以从输入输出的方式进行考虑,还可以从数据量的方面进行考虑