错误示例
对全部数据先按年龄排序,查询时将要求的年龄段内的所有人放到一个优先队列中,再根据给定的输出人数,从优先队列中取出排在优先队列队首的人。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
struct node {
char name[9];
int age, netWorth;
friend bool operator < (node n1, node n2) {
if (n1.netWorth != n2.netWorth)
return n1.netWorth < n2.netWorth;
else if (n1.age != n2.age)
return n1.age > n2.age;
else return strcmp(n2.name, n1.name) < 0;
}
}people[100000];
bool cmp1(node n1, node n2) {
return n1.age < n2.age;
}
int peopleNum, queryNum;
int main() {
scanf("%d %d", &peopleNum, &queryNum);
for (int i = 0;i < peopleNum;i++) {
scanf("%s %d %d", &people[i].name, &people[i].age, &people[i].netWorth);
}
sort(people, people + peopleNum, cmp1); //按年龄排序
for (int i = 0;i < queryNum;i++) {
priority_queue<node> heap;
int num, minAge, maxAge;
scanf("%d %d %d", &num, &minAge, &maxAge);
int left = 0, right = peopleNum - 1;
while (left < right) { //二分查找起始位置
int mid = (left + right) / 2;
if (people[mid].age >= minAge) {
right = mid;
}
else if (people[mid].age < minAge) {
left = mid + 1;
}
}
int index = left;
while (index < peopleNum && people[index].age <= maxAge && people[index].age >= minAge) {
heap.push(people[index]);
index++;
}
printf("Case #%d:\n", i + 1);
if (heap.empty()) {
printf("None\n");
}
else {
int count = 0;
while (count < num && !heap.empty()) {
node temp = heap.top();
heap.pop();
printf("%s %d %d\n", temp.name, temp.age, temp.netWorth);
count++;
}
}
}
}
因为总人数很多,高达10^5,而每次查询最多只要100个人。此外,查询要求的年龄范围可能很大,导致优先队列中数据的规模很大,所以不适合根据年龄对数据进行排序。
应该对所有数据根据资产排序。新开一个数组,对于同一个年龄的人,将100名开外的人剔除,即对于每个年龄,只保留资产前100的人。在处理查询时,从头开始遍历这个新数组,遇到符合年龄要求的数据就将它加入到结果集中。
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
struct node {
char name[9];
int age, netWorth;
}people[100000];
vector<node> top100EveryAge;
int book[201] = { 0 };
bool cmp(node n1, node n2) {
if (n1.netWorth != n2.netWorth)
return n1.netWorth > n2.netWorth;
else if (n1.age != n2.age)
return n1.age < n2.age;
else return strcmp(n2.name, n1.name) > 0;
}
int peopleNum, queryNum;
int main() {
scanf("%d %d", &peopleNum, &queryNum);
for (int i = 0;i < peopleNum;i++) {
scanf("%s %d %d", &people[i].name, &people[i].age, &people[i].netWorth);
}
sort(people, people + peopleNum, cmp); //按资产排序
for (int i = 0;i < peopleNum;i++) {
int age = people[i].age;
if (book[age] < 100) {
top100EveryAge.push_back(people[i]);
book[age]++;
}
}
for (int i = 0;i < queryNum;i++) {
vector<node> v;
int outputNum, minAge, maxAge;
scanf("%d %d %d", &outputNum, &minAge, &maxAge);
int count = 0, index = 0;
while (count < outputNum && index < top100EveryAge.size()) {
int age = top100EveryAge[index].age;
if (age >= minAge && age <= maxAge) {
v.push_back(top100EveryAge[index]);
}
index++;
}
printf("Case #%d:\n", i + 1);
if (v.empty()) {
printf("None\n");
}
else {
int count = 0;
while (count < outputNum && count < v.size()) {
printf("%s %d %d\n", v[count].name, v[count].age, v[count].netWorth);
count++;
}
}
}
}