【PAT】1055 The World‘s Richest (25 分)

46 篇文章 0 订阅
44 篇文章 0 订阅
本文讲解了一种算法,通过结构化数据和比较函数,对一组人员的年龄、财富进行排序,查询给定年龄范围内的最富有者,如无匹配则输出'None'。关键步骤包括使用vector存储信息、自定义比较函数以及对查询结果的处理。
摘要由CSDN通过智能技术生成
  • 题目大意:找出在给定年龄范围内最有钱的人。输出按净财富降序排序,若相同,则按年龄增序,若还相同,按照名字增序排序。若查询结果为0,则输出"None"。

  • 思路:

    1. 先将所有人的信息都存入vector,然后进行排序。
    2. 查询时输出年龄在给定范围内的人的信息,若查询结果为0,则输出"None"(用flag记录是否有查询结果)
  • 知识点:

    • 结构体
    • sort
    • 字符串数组
      • strcmp(str1, str2)
  • 代码:

    #include <iostream>
    #include <vector>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    
    struct peo{
        char name[9];   // 字符串数组大小定义要比8多1,因为字符串结尾有个字符串结束的标志'\0'
        int age, net_worth;
    };
    
    bool cmp(peo a, peo b){
        if(a.net_worth != b.net_worth)
            return a.net_worth > b.net_worth;
        else
            return a.age != b.age ? a.age < b.age : strcmp(a.name, b.name) < 0;
    }
    
    int main()
    {
        int n, k;
        scanf("%d %d", &n, &k);
        vector<peo> v(n);
        for(int i = 0; i < n; i++){
            scanf("%s %d %d", v[i].name, &v[i].age, &v[i].net_worth);
        }
        sort(v.begin(), v.end(), cmp);
    
        for(int i = 0; i < k; i++){
            printf("Case #%d:\n", i+1);
            int m, amin, amax;
            bool flag = false;
            scanf("%d %d %d", &m, &amin, &amax);
            for(int j = 0; j < n && m > 0; j++){
                if(v[j].age >= amin && v[j].age <= amax){
                    flag = true;
                    printf("%s %d %d\n", v[j].name, v[j].age, v[j].net_worth);
                    m--;
                }
            }
            if(!flag)
                printf("None\n");
        }
        return 0;
    }
    
  • 总结:

    1. 细节:

      1. 已知名字字符串最多有8个字符,在定义字符串数组大小时应该大于8,因为字符串后面还有个停止符'\0'
      2. 字符串数组的比较需要调用string.h库里的strcmp(str1, str2)
    2. 字符串数组的定义:

      char name[10];	// 表示定义了 10 字节的连续内存空间。
      
      1. 如果字符串的长度大于 10:会报错

      注意,这里指的**“字符串的长度”包括最后的 ‘\0’**。虽然系统会自动在字符串的结尾加 ‘\0’,但它不会自动为 ‘\0’ 开辟内存空间。所以在定义数组长度的时候一定要考虑 '\0’

      1. 如果字符串的长度小于 10:则只将字符串中的字符赋给数组中前面的元素,剩下的内存空间系统会自动用 \0’ 填充

      2. char name[10] = "";
        

        若字符串数组被初始化为一个空字符串,则数组每位都被初始化为'\0'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值