zoukankan      html  css  js  c++  java
  • 排序入门练习题10 病人排队 题解

    题目出处:《信息学奥赛一本通》第二章上机练习8。

    题目描述

    病人等级看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:

    1. 老年人(年龄 (ge) 60岁)比非老年人优先看病。
    2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
    3. 非老年人按登记的先后顺序排序。

    输入格式

    (1) 行,输入一个不大于 (1000) 的正整数,表示病人的个数;
    后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度不大于 (10) 的字符串表示病人的 ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。

    输出格式

    按排好的看病顺序输出病人的ID,每行一个。

    样例输入

    5
    020010 40
    004312 15
    010133 67
    023815 75
    102031 23
    

    样例输出

    023815
    010133
    020010
    004312
    102031
    

    题目分析

    这道题目是结构体排序。
    首先我们要思考的问题是怎么定义结构体:因为病人的ID包含数字和字符,所以我用一个整数 number 来表示病人的登记顺序,用一个字符数组 card 来表示病人的ID,用一个整数 age 来表示病人的年龄。“病人”的英文是“patient”,所以我就开一个名为 Patient 的结构体,并在定义结构体的同时初始化结构体数组(我这里用数组 a 表示):

    struct Patient {
        int number;   // 登记的顺序
        char id[11];  // 病人ID
        int age;      // 年龄
    } a[1010];
    

    比较函数按照题目描述来:

    bool cmp(Patient a, Patient b) {
        if (a.age >= 60 && b.age >= 60) {   //a,b都是老年人
            if (a.age != b.age) // 如果年龄不一样
                return a.age > b.age;   // 按年龄从大到小排
            else    // 否则,年龄一样
                return a.number < b.number;  // 按登记顺序排
        }
        else if (a.age >= 60)   // a是老人,b不是老人
            return true;    // a排前面
        else if (b.age >= 60)   // b是老人,a不是老人
            return false;   // b排前面
        else        // 两个都是年轻人
            return a.number < b.number;  // 按登记顺序排
    }
    

    需要注意的是:因为输入格式只告诉了我们病人的ID和年龄,并没有告诉我们登记的顺序,所以我们还得主动为每一位病人标记登记的顺序,最简单的一种方式就是第 (i) 位病人的登记顺序就是 (i)
    实现代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    struct Patient {
        int number;   // 登记的顺序
        char id[11];  // 病人ID
        int age;      // 年龄
    } a[1010];
    int n;
    bool cmp(Patient a, Patient b) {
        if (a.age >= 60 && b.age >= 60) {   //a,b都是老年人
            if (a.age != b.age) // 如果年龄不一样
                return a.age > b.age;   // 按年龄从大到小排
            else    // 否则,年龄一样
                return a.number < b.number;  // 按登记顺序排
        }
        else if (a.age >= 60)   // a是老人,b不是老人
            return true;    // a排前面
        else if (b.age >= 60)   // b是老人,a不是老人
            return false;   // b排前面
        else        // 两个都是年轻人
            return a.number < b.number;  // 按登记顺序排
    }
    int main() {
        cin >> n;
        for (int i = 0; i < n; i ++) {
            cin >> a[i].id >> a[i].age;
            a[i].number = i;    // 用 i 来表示 第 i 个病人的登记顺序
        }
        sort(a, a+n, cmp);
        for (int i = 0; i < n; i ++)
            cout << a[i].id << endl;
        return 0;
    }
    
  • 相关阅读:
    JAVA并发编程学习笔记之ReentrantLock
    服务架构演进
    Java集群优化——dubbo+zookeeper构建高可用分布式集群
    Dubbo实例
    hessian学习
    JAVA分布式事务原理及应用
    了解AngularJS $resource
    AngularJS Resource:与 RESTful API 交互
    Hibernate解决高并发问题之:悲观锁 VS 乐观锁
    互联网金融高并发方案
  • 原文地址:https://www.cnblogs.com/zifeiynoip/p/11450528.html
Copyright © 2011-2022 走看看