排序入门练习题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;
}

猜你喜欢

转载自www.cnblogs.com/zifeiynoip/p/11450528.html