PAT甲级真题1062 才华与德行(简单代码)

大约 900900 年前,中国哲学家司马光写了一本历史书,其中谈到了人们的才华和德行。

按照他的理论,才华和德行都杰出的人是圣人。

才华一般,德行过人的人是君子。

才华,德行都一般,但是德行胜过才华的人是愚人。

以上都不满足的是小人。

现在,给定每个人的才华和德行,请你根据司马光的理论对他们排名。

输入格式
第一行包含三个整数,NN,表示总人数,LL,表示合格分数线,仅对才华和德行均不低于此线的那些人进行排名,HH,表示优秀分数线。

下面对四种人进行分类:

才华和德行均不低于 HH 的是圣人,圣人们按德才总分不升序排序。
才华低于 HH,德行不低于 HH 的是君子,君子们按德才总分不升序排序,他们都低于圣人。
才华和德行均低于 HH,但是德行不低于才华的是愚人,愚人们按德才总分不升序排序,他们都低于君子。
能够参与排名的,不属于以上三类人的均是小人,小人们按德才总分不升序排序,他们都低于愚人。
接下来 NN 行,每行包含一个人的信息,包括一个人的ID,德行,才华。(注意顺序)

ID 是唯一 88 位数字,德行和才华是 [0,100][0,100] 之间的整数。

输出格式
第一行包含整数 MM,表示总参与排名的人数。

接下来 MM 行,按照排名规则,从前到后输出每个人的信息,每个人占一行。

依次输出所有圣人、君子、愚人和小人。

同一类人之中,如果出现总分相同的情况,则按德行分不升序排名,如果得分完全相同,则按 ID 升序排名。

数据范围
1≤N≤1051≤N≤105,
60≤L<H<10060≤L<H<100
输入样例:
14 60 80
10000001 64 90
10000002 90 60
10000011 85 80
10000003 85 80
10000004 80 85
10000005 82 77
10000006 83 76
10000007 90 78
10000008 75 79
10000009 59 90
10000010 88 45
10000012 80 100
10000013 90 99
10000014 66 60
输出样例:
12
10000013 90 99
10000012 80 100
10000003 85 80
10000011 85 80
10000004 80 85
10000007 90 78
10000006 83 76
10000005 82 77
10000002 90 60
10000014 66 60
10000008 75 79
10000001 64 90

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 100010;

int n, L, H;
struct Person
{
    int id, moral, talent,total;
    int level;

    bool operator< (const Person &t) const
    {
        if (level != t.level) return level < t.level;//先按等级排序
        if (total!= t.total) return total > t.total;
        if (moral != t.moral) return moral > t.moral;
        return id < t.id;
    }
}p[N];

int main()
{
    scanf("%d%d%d", &n, &L, &H);

    int m = 0;
    for (int i = 0; i < n; i ++ )
    {
        int id, moral, talent;
        scanf("%d%d%d", &id, &moral, &talent);
        if (moral < L || talent < L) continue;
        int level;
        if (moral >= H && talent >= H) level = 1;
        else if (moral >= H && talent < H) level = 2;
        else if (moral < H && talent < H && moral >= talent) level = 3;
        else level = 4;

        p[m ++ ] = {id, moral, talent,moral+talent,level};
    }

    sort(p, p + m);

    printf("%d\n", m);
    for (int i = 0; i < m; i ++ )
        printf("%08d %d %d\n", p[i].id, p[i].moral, p[i].talent);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王子y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值