1055 The World’s Richest (25 分)
传送门
题目意思:
属性 | 类型 | 范围 |
---|
name | string | 长度 <= 8 |
age | int | (0-200] |
排序:
net_worth | 非递增 |
---|
net_worth 相等 | age 非递减 |
net_worth, age 都相等 | name 非递减 |
无 | None |
开始代码 — 超时了
#include <bits/stdc++.h>
using namespace std;
struct node {
string name;
int age;
int net_worth;
}stu[100001];
bool cmp(node a, node b) {
if (a.net_worth != b.net_worth) {
return a.net_worth >= b.net_worth;
}
else if (a.age != b.age) {
return a.age <= b.age;
} else {
return a.name <= b.name;
}
}
int main() {
int n, k;
scanf("%d %d", &n, &k);
int t = -1;
int a[k];
string temp;
temp.resize(8);
for (int i = 0; i < n; i++) {
scanf("%s %d %d", &temp[0], &stu[i].age, &stu[i].net_worth);
stu[i].name = temp;
}
int minAge, maxAge;
for (int i = 0; i < k; i++) {
scanf("%d %d %d", &a[i], &minAge, &maxAge);
vector<node> list;
t++;
for (int j = 0; j < n; j++) {
if (stu[j].age >= minAge && stu[j].age <= maxAge) {
list.push_back(stu[j]);
}
}
sort(list.begin(),list.end(),cmp);
if (list.empty()) {
printf("Case #%d:\nNone\n",i+1);
} else {
printf("Case #%d:\n",i+1);
for(int m = 0; m < list.size() && m<a[i]; m++) {
printf("%s %d %d\n",(list[m].name).c_str(),list[m].age,list[m].net_worth);
}
}
}
return 0;
}
优化
开始代码超时原因应该是在循环里面sort排序了几次,开销增大。
现在,只排序一次,然后从排序号的人里面选择在不同年龄区间的,根据每次最多人数输出结果。
当然,可以最后只保留排完序的前100个数,然后选择在不同年龄区间的,根据每次最多人数输出结果。
#include <bits/stdc++.h>
using namespace std;
struct node {
string name;
int age;
int net_worth;
}stu[100001];
bool cmp(node a, node b) {
if (a.net_worth != b.net_worth) {
return a.net_worth >= b.net_worth;
}
else if (a.age != b.age) {
return a.age <= b.age;
} else {
return a.name <= b.name;
}
}
int main() {
freopen("datain.txt","r",stdin);
int n, k;
scanf("%d %d", &n, &k);
int t = -1;
int a[k];
string temp;
temp.resize(8);
for (int i = 0; i < n; i++) {
scanf("%s %d %d", &temp[0], &stu[i].age, &stu[i].net_worth);
stu[i].name = temp;
}
sort(stu,stu+n,cmp);
int minAge, maxAge;
for (int i = 0; i < k; i++) {
scanf("%d %d %d", &a[i], &minAge, &maxAge);
int t = 0;
bool flag = true;
printf("Case #%d:\n", i+1);
for (int j = 0; j < n && t < a[i]; j++) {
if (stu[j].age >= minAge && stu[j].age <= maxAge) {
printf("%s %d %d\n", (stu[j].name).c_str(), stu[j].age, stu[j].net_worth);
flag = false;
t++;
}
}
if (flag) {
printf("None");
}
}
return 0;
}