A1055 The World's Richest (25 分| 排序,附详细注释,逻辑分析)

写在前面

  • 思路分析
    • 给出n个人姓名、年龄和拥有的钱,然后进行k次查询,每次查询输出在年龄区间内的财富值从大到小的前m个人的信息。如果财富值相同先输出年龄小的,如果年龄相同把名字按照字典序排序输出
    • 自定义排序函数
    • 不能先排序然后根据每1个条件新建1个数组、对新数组排序的方法,测试点2超时
      • n和m悬殊太大, n有10的5次方, m100个
      • 有效数据压缩
        • 所以先把所有的人按照财富值排序,建立1个数组book标记每个年龄段拥有的人的数量,遍历数组并统计相应年龄的人数,当前年龄人数不超过100压入新的数组。即只取每个年龄前100名
      • 根据新数组里面取符合相应年龄人的信息
    • 格式化输出
  • 问题点
    • 超时问题
    • 压缩思想、条件转化
  • 题目有1定难度,细节问题耗费时间

测试用例

  • input:
    12 4
    Zoe_Bill 35 2333
    Bob_Volk 24 5888
    Anny_Cin 95 999999
    Williams 30 -22
    Cindy 76 76000
    Alice 18 88888
    Joe_Mike 32 3222
    Michael 5 300000
    Rosemary 40 5888
    Dobby 24 5888
    Billy 24 5888
    Nobody 5 0
    4 15 45
    4 30 35
    4 5 95
    1 45 50
    
    output:
    Case #1:
    Alice 18 88888
    Billy 24 5888
    Bob_Volk 24 5888
    Dobby 24 5888
    Case #2:
    Joe_Mike 32 3222
    Zoe_Bill 35 2333
    Williams 30 -22
    Case #3:
    Anny_Cin 95 999999
    Michael 5 300000
    Alice 18 88888
    Cindy 76 76000
    Case #4:
    None
    

ac代码

  • #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <cstring>
    using namespace std;
    struct node
    {
        char name[10];
        int age, money;
    };
    int cmp1(node a, node b)
    {
        if(a.money != b.money)
            return a.money > b.money;
        else if(a.age != b.age)
            return a.age < b.age;
        else
            return (strcmp(a.name, b.name) < 0);
    }
    int main()
    {
        int n, k, num, amin, amax;
        scanf("%d %d", &n, &k);
        vector<node> vt(n), v;
        vector<int> book(205, 0);
    
        for(int i = 0; i < n; i++)
            scanf("%s %d %d", vt[i].name, &vt[i].age, &vt[i].money);
        sort(vt.begin(), vt.end(), cmp1);
    
        // 根据查询需要进行数据压缩
        for(int i = 0; i < n; i++)
        {
            if(book[vt[i].age] < 100)
            {
                v.push_back(vt[i]);
                book[vt[i].age]++;
            }
        }
    
        // 读入查询, 循环打印查询结果
        for(int i = 0; i < k; i++)
        {
            scanf("%d %d %d", &num, &amin, &amax);
            vector<node> t;
            for(int j = 0; j < v.size(); j++)
            {
                if(v[j].age >= amin && v[j].age <= amax)
                    t.push_back(v[j]);
            }
            if(i != 0) printf("\n");
            printf("Case #%d:", i + 1);
            int flag = 0;
            for(int j = 0; j < num && j < t.size(); j++)
            {
                printf("\n%s %d %d", t[j].name, t[j].age, t[j].money);
                flag = 1;
            }
            if(flag == 0) printf("\nNone");
        }
        return 0;
    }
    

知识点小结

发布了328 篇原创文章 · 获赞 107 · 访问量 39万+

猜你喜欢

转载自blog.csdn.net/qq_24452475/article/details/100611563