【PAT】1062 Talent and Virtue (25 分)

46 篇文章 0 订阅
44 篇文章 0 订阅
  • 题目大意:司马光通过道德和才能定义一个人,先定义一个最低底线low和最高标准high,

    1. 若一个人的道德和才能都高于high,他就是圣人;
    2. 若一个人的道德高于high,才能低于high高于low,他就是君子;
    3. 若一个人的道德低于high高于low,才能低于high高于low,但**道德>=才能(not lower than,所以是大于等于号)**他就是愚人;
    4. 若一个人道德<才能,他就是小人。

    给一群人按照总分=道德+才能降序排序,若总分相同,则按道德降序排序,若还相同,就按id升序排序。只有道德和才能都高于high才有资格上榜。

  • 思路:

    1. 用一个二维数组存四种人,这样就不用定义四个数组,可以减少代码量;
    2. 判断这个人属于哪种人,若满足条件,就放进二维数组相应的列里。
  • 知识点:

    1. 结构体
    2. vector
    3. sort
  • 代码:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    struct man{
    //    char id[8]; // 用这个末尾会多一个字符,为什么呢?
        int id;
        int v, t, total;
    };
    
    bool cmp(man a, man b){
        if(a.total == b.total)
            return a.v == b.v ? a.id < b.id : a.v > b.v;
        return a.total > b.total;
    }
    
    int main(){
        int n, l, h;
        scanf("%d %d %d", &n, &l, &h);
        vector<man> men[4];
        man temp;
        for(int i = 0; i < n; i++){
            scanf("%d %d %d", &temp.id, &temp.v, &temp.t);
            temp.total = temp.v + temp.t;   // 不要忘记给total赋值
            if(temp.v >= l && temp.t >= l){
                if(temp.v >= h && temp.t >= h)  // 圣人
                    men[0].push_back(temp);
                else if(temp.v >= h && temp.t < h)  // 君子
                    men[1].push_back(temp);
                else if(temp.v < h && temp.t < h && temp.v >= temp.t)  // 愚人,注意是temp.v >= temp.t
                    men[2].push_back(temp);
                else  // 小人
                    men[3].push_back(temp);
            }
        }
        printf("%d\n", men[0].size() + men[1].size() + men[2].size() + men[3].size());
        for(int i = 0; i < 4; i++){
            sort(men[i].begin(), men[i].end(), cmp);
            for(auto it = men[i].begin(); it != men[i].end(); it++)
                printf("%d %d %d\n", it->id, it->v , it->t);
        }
        return 0;
    }
    
  • 总结:

    1. ID_Number是8位小数,如果用字符串char id[8]存ID_Number,最后输出ID_Number后面会有个大写字母,不知道是怎么回事。换成int后输出正常;

    2. "fool man"的定义是“virtue not lower than talent”,所以应该是temp.v >= temp.t,而不是小于号;

    3. 细节:

      1. 因为temp.total要另外算,所以忘记了temp.total = temp.v + temp.t;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值