题目
题目大意
输入给出富人的总数以及富人的姓名、年龄、财富,接下来的k行给出需要排序的个数,每个排序要求输出m个富人,并且限制了年龄段,[Amin, Amax]。要求输出所有的排序。如果满足年龄段的人数为0,就输出None。如果富人财富相同,年龄小的优先输出,如果年龄也相同,名字字母序小的优先输出。
思路
本来我的思路是用结构体存储完整个富人信息后,再用for循环遍历每个条件,筛选出符合年龄段的人存储到一个新数组中,再在这个新数组中排序,最后输出结果。但是测试点2运行超时,核心代码如下。
这个新数组v2在for循环中不断迭代,一直开新的空间,比较占内存,然后我又将v2放到for循环的外面,每次遍历的时候都用clear()将v2清空,但是还是超时。这里我没有想到的是,题目中的n值是很大的,10的6次方,但是要求输出的值只有m<=100个。(做题的过程中,把题中的m当成k了,然后把m弄成num了,这里没看好题)所以不能将n个全存数组后才输出,应该一边判断是否在年龄段中一边输出,当输出的数量达到要求后,再break见好就收。因此要在for循环之前就将全部的数组排序,然后在循环内遍历排序好的数组,找到符合年龄段的元素后输出。v2数组也就没有存在的必要了。另外,我把vector改成了int,速度应该能更快一点。
代码
#include <iostream>
#include <algorithm>
using namespace std;
struct man{
string name;
int age;
int money;
}v[100003];
bool cmp(man x, man y){
if (x.money == y.money){
if (x.age == y.age){
return x.name < y.name;
}else{
return x.age < y.age;
}
}else{
return x.money > y.money;
}
}
int main(){
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++){
cin >> v[i].name >> v[i].age >> v[i].money;
}
sort(v, v + n, cmp);
for (int i = 0; i < m; i++){
int num, amin, amax;
cin >> num >> amin >> amax;
cout << "Case #" << i + 1 << ":" << endl;
int count = 0;
for (int j = 0; j < n; j++){
if (v[j].age >= amin && v[j].age <= amax){
cout << v[j].name << " " << v[j].age << " " << v[j].money << endl;
count++;
}
if (count == num){
break;
}
}
if (count == 0){
cout << "None" << endl;
}
}
return 0;
}