- 预处理trick: 这道题在输出时,由于每个年龄段最多输出100个,所以每个年龄只有前100名才是有效的,即一共最多只有20000个人是有效的。于是在排序之后,用Age[201]记录每个年龄的有效人数,如果这个年龄的有效人数未满,则把这个人添加到valid[100010]数组中,且该数组仍然保持降序排列,只不过去除了一定不会输出的人。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int Age[210] = {0};
struct rich{
char name[10];
int age;
int asset;
} billionire[100010],valid[100010];
int validnum = 0;
bool cmp(rich r1,rich r2){
if(r1.asset!=r2.asset)
return r1.asset > r2.asset;
else if (r1.age!=r2.age)
return r1.age < r2.age;
else
return strcmp(r1.name, r2.name) < 0;
}
int main(){
int n, k;
scanf("%d%d", &n, &k);
for (int i = 0; i < n;i++){
scanf("%s%d%d", billionire[i].name, &billionire[i].age, &billionire[i].asset);
}
sort(billionire, billionire + n, cmp);
for (int i = 0; i < n;i++){
if(Age[billionire[i].age] < 100){
Age[billionire[i].age]++;
valid[validnum++] = billionire[i];
}
}
int m, Amin, Amax;
for (int i = 1; i <= k;i++){
int flag = 0;
scanf("%d%d%d", &m, &Amin, &Amax);
printf("Case #%d:\n", i);
for (int j = 0; j < validnum;j++){
if (valid[j].age >= Amin && valid[j].age <= Amax)
{
flag++;
if(flag<=m)
printf("%s %d %d\n", valid[j].name, valid[j].age, valid[j].asset);
else
break;
}
}
if(flag==0)
printf("None\n");
}
}