PAT Basic Level 1015. 德才论(25)

【来源】

1015. 德才论(25)

【分析】

    此题本质上是一个排序问题。使用C++ STL中的sort函数并根据题意自定义compare函数即可。

    在输入的时候将所有考生分成四类:“才德全尽”、“德胜才”、“才德兼亡,但德胜才”,以及剩下的达到及格线的考生。然后各自排序,依次输出即可。

    需注意使用cin、cout可能会超时。

【源码】

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

struct candidate
{
    int id;
    int de;
    int cai;
};

bool compare(candidate lhs, candidate rhs)
{
    if ((lhs.cai + lhs.de) < (rhs.de + rhs.cai)){
        return false;
    }
    else if ((lhs.cai + lhs.de) > (rhs.de + rhs.cai)){
        return true;
    }
    else{
        if (lhs.de < rhs.de){
            return false;
        }
        else if (lhs.de > rhs.de){
            return true;
        }
        else{
            if (lhs.id < rhs.id){
                return true;
            }
            else{
                return false;
            }
        }
    }
}

int main()
{
    int n, l, h;
  
    scanf_s("%d%d%d", &n, &l, &h);

    vector<candidate> class1;
    vector<candidate> class2;
    vector<candidate> class3;
    vector<candidate> class4;

    int count = 0;
    for (int i = 0; i < n; ++i){
        candidate can;
        scanf_s("%d%d%d", &can.id, &can.de, &can.cai);
        if (can.de >= l && can.cai >= l){
            ++count;
            if (can.de >= h && can.cai >= h){
                class1.push_back(can);
            }
            else if (can.de >= h && can.cai < h){
                class2.push_back(can);
            }
            else if (can.de < h && can.cai < h && can.de >= can.cai){
                class3.push_back(can);
            }
            else{
                class4.push_back(can);
            }
        }
    }

    printf("%d\n", count);
    sort(class1.begin(), class1.end(), compare);
    sort(class2.begin(), class2.end(), compare);
    sort(class3.begin(), class3.end(), compare);
    sort(class4.begin(), class4.end(), compare);

    vector<candidate>::const_iterator cit1;
    for (cit1 = class1.begin(); cit1 != class1.end(); ++cit1){
        printf("%d %d %d\n", cit1->id, cit1->de, cit1->cai);
    }

    vector<candidate>::const_iterator cit2;
    for (cit2 = class2.begin(); cit2 != class2.end(); ++cit2){
        printf("%d %d %d\n", cit2->id, cit2->de, cit2->cai);
    }

    vector<candidate>::const_iterator cit3;
    for (cit3 = class3.begin(); cit3 != class3.end(); ++cit3){
        printf("%d %d %d\n", cit3->id, cit3->de, cit3->cai);
    }

    vector<candidate>::const_iterator cit4;
    for (cit4 = class4.begin(); cit4 != class4.end(); ++cit4){
        printf("%d %d %d\n", cit4->id, cit4->de, cit4->cai);
    }

    return 0;
}

【点评】

此题为排序题,充分理解题意后不难写出代码。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值