1062 Talent and Virtue (25分)[排序]

By Jalan

知识工具需求

数学

数据结构和算法

  • 排序

语言

  • sort函数,在编写cmp的时候可以只写所有返回1的情况,末尾跟个返回0

题干

900年前中国哲学家司马光写了个历史书,在其中谈论了人名的天赋和品德,在他的理论里,才德兼备是圣人,德超才是君子,都不好是愚人.才大于德是小人.
现在给才德分,分类.

输入条件

第一行3正整数N<=10^5是总人数,L>=60是下界高于L才算.H<100是高标准界.
下面N行格式:
ID_Number Virtue_Grade Talent_Grade
ID是8位数字,成绩[0,100]\

例1

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

输出条件

第一行打印M<=N是参与排序的总数
下面M行
都高于H是圣人.按总分非递增排序.
才比H低,德比H高是是君子,也总分非递增在圣人后面
两个都比H低但是德比才高是愚人.非递增在君子后面
剩下的都比L高的排在愚人后
先按总分非递增,总分一致按德分非递增,德分一致按ID升序

例1

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

题解

第一次

思路

  1. 建立4个表,在输入的时候就进行区分.和统计总人数
  2. 输入完按规则排序每个表
  3. 输出总人数和每个表

预期时间复杂度

nlogn

编写用时

16分钟

代码

CPP
#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;
typedef struct node
{
    int id;
    int v;
    int t;
} node;
int cmp(node a, node b)
{
    if (a.t + a.v > b.t + b.v)
    {
        return 1;
    }
    else if (a.t + a.v == b.t + b.v)
    {
        if (a.v > b.v)
        {
            return 1;
        }
        else if (a.v == b.v)
        {
            if (a.id < b.id)
            {
                return 1;
            }
        }
    }
    return 0;
}
int main(int argc, char const *argv[])
{
    //input&&process
    int N, L, H;
    scanf("%d%d%d", &N, &L, &H);
    vector<node> sages, nobleman, foolman, snob;
    node temp;
    int count = 0;
    for (int i = 0; i < N; i++)
    {
        scanf("%d%d%d", &temp.id, &temp.v, &temp.t);
        if (temp.v < L || temp.t < L)
        {
            continue;
        }
        ++count;
        if (temp.v >= H && temp.t >= H)
        {
            sages.push_back(temp);
        }
        else if (temp.v >= H)
        {
            nobleman.push_back(temp);
        }
        else if (temp.v >= temp.t)
        {
            foolman.push_back(temp);
        }
        else
        {
            snob.push_back(temp);
        }
    }
    sort(sages.begin(), sages.end(), cmp);
    sort(nobleman.begin(), nobleman.end(), cmp);
    sort(foolman.begin(), foolman.end(), cmp);
    sort(snob.begin(), snob.end(), cmp);
    
    //output
    printf("%d\n",count);
    for (int i = 0; i < sages.size(); i++)
    {
        printf("%08d %d %d\n",sages[i].id,sages[i].v,sages[i].t);
    }
    for (int i = 0; i < nobleman.size(); i++)
    {
        printf("%08d %d %d\n", nobleman[i].id, nobleman[i].v, nobleman[i].t);
    }
    for (int i = 0; i < foolman.size(); i++)
    {
        printf("%08d %d %d\n", foolman[i].id, foolman[i].v, foolman[i].t);
    }
    for (int i = 0; i < snob.size(); i++)
    {
        printf("%08d %d %d\n", snob[i].id, snob[i].v, snob[i].t);
    }
    return 0;
}

运行用时

在这里插入图片描述

结尾

看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀@.@
也欢迎关注我的CSDN账号呀,接下来两个月我应该会按这个格式更新所有的PTA甲级题目

                                        **开心code每一天**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值