【每日一题】病人排队

题目描述

小理是个热爱生活的孩子。

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

1. 老年人(年龄 ≥≥ 60岁)比非老年人优先看病。

2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。

3. 非老年人按登记的先后顺序看病。

输入

第一行一个正整数 n(n≤100),表示病人的个数。

接下来 n 行,每行输入一个病人的信息,包括:

一个长度为 4 的字符串表示病人的编号(每个病人的编号各不相同且只含数字和大写字母),一个整数表示病人的年龄,中间用单个空格隔开。

输出

输出共 n 行,按排好的看病顺序输出病人的编号,每行一个字符串。

样例输入

5
1075 40
4003 15
01B8 65
1GC3 75
201A 30

样例输出

1GC3
01B8
1075
4003
201A
#include 
#include 
#include 
using namespace std;

struct Patient {
    string id; // 病人编号
    int age;   // 病人年龄
    int order; // 病人登记的先后顺序
};

bool cmp(Patient a, Patient b) {
    if (a.age >= 60 && b.age >= 60) { // 两个都是老年人,按照年龄从大到小排序
        if (a.age == b.age) return a.order < b.order; // 年龄相同按照登记先后顺序
        return a.age > b.age;
    }
    else if (a.age >= 60) return true; // a 是老年人,优先级更高,sort函数默认从小到大排序,即return a= 60) return false; // b 是老年人,优先级更高,
    else return a.order < b.order; // 都是非老年人,按照登记先后顺序
}

int main() {
    int n;
    cin >> n;
    Patient patients[n];
    for (int i = 0; i < n; i++) {
        cin >> patients[i].id >> patients[i].age;
        patients[i].order = i; // 记录登记的先后顺序
    }
    sort(patients, patients + n, cmp);
    for (int i = 0; i < n; i++) {
        cout << patients[i].id << endl;
    }
    return 0;
}

首先,定义一个结构体 Patient,包含病人的编号、年龄和登记的先后顺序。使用 bool cmp(Patient a, Patient b) 函数作为排序函数,根据题目要求实现排序规则。

然后,读入病人信息并记录登记的先后顺序。使用 sort 函数对病人信息进行排序。最后,按照排好的顺序输出病人编号。

// 沙壁vc里的c++要求数组必须是常量值,不能用变量

  1. 动态分配

int n;
cin >> n;
int *a=new int[n];
delete[]a;
  1. vector

int n;
cin >> n;
vector  a(n);
  1. 比赛是不会有这个问题,大都用GCC编译器

你可能感兴趣的:(算法,c++,sort,sorting,algorithm)