氧os哪个网站做的最好/google手机官网
题目大意:给出n个人的姓名、年龄和拥有的钱,然后进行k次查询,每次查询输出在年龄区间内的财富值的从大到小的前m个人的信息。如果财富值相同就就先输出年龄小的,如果年龄相同就把名字按照字典序排序输出~
注意事项:
- 题目本身不难,就是第二个点,他给你很多数据,然后你如果直接查询会消耗大量时间,然后因为依据年龄查询,每一个年龄是一个最小单位,每次查询最多输出100个用户数据,就把每个年龄财富最多的前100个人存入一个新数组,不一定会存满,然后最后再新数组上操作,这样就不会超时了,PAT就是老是卡某个点,感觉A组题所有测试点一次通过还是不容易的。加油~
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct person
{char name[15];int age;int money;
}per[100001],temp[100001];
int agecount[100001] = { 0 }; //某年龄的人数
bool cmp(person a, person b)
{if (a.money != b.money)return a.money > b.money;else if (a.age != b.age)return a.age < b.age;elsereturn strcmp(a.name, b.name) < 0;
}
int main()
{int n, m;cin >> n >> m;for (int i = 0; i < n; i++){cin >> per[i].name >> per[i].age >> per[i].money;}sort(per, per + n, cmp);int num = 0;for (int i = 0; i < n; i++){if (agecount[per[i].age] < 100){agecount[per[i].age]++;temp[num++] = per[i];}}int c, age1, age2;for (int i = 0; i < m; i++){cin >> c >> age1 >> age2;cout << "Case #"<<i+1<<":"<<endl;int count = 0;for (int j = 0; j < num; j++){if (temp[j].age <= age2 && temp[j].age >= age1){cout << temp[j].name <<" "<< temp[j].age <<" "<< temp[j].money << endl;count++;if (count == c)break;}}if (count == 0){cout << "None" << endl;}}}