【每日一题】病人排队

题目描述

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

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

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 <iostream>
#include <algorithm>
#include <string>
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<b    所以当return true 时默认a<b为true,从小到大排序输出a。
    else if (b.age >= 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 <int> a(n);
  1. 比赛是不会有这个问题,大都用GCC编译器

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 这是一个病人登记看病程序,按照以下原则排出看病先后顺序: 1. 老年人(年龄 >= 60岁)比非老年人优先看病。 2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记先后顺序排序。 3. 非老年人按登记先后顺序看病。 ### 回答2: 为了按照以上原则排出看病先后顺序,我们可以编写一个程序,包括以下步骤: 1. 从数据库或其他数据源中获取病人登记信息,包括姓名、年龄、性别、登记时间等。 2. 根据年龄判断病人是否属于老年人,将老年人和非老年人分别放到两个不同的队列中。 3. 对老年人的队列进行排序,首先按年龄从大到小排序,然后对同龄的病人按照登记时间从早到晚排序。 4. 把非老年人的队列按照登记时间从早到晚排序。 5. 将老年人队列和非老年人队列依次合并成一个队列,其中老年人队列排在非老年人队列的前面。 6. 输出按照排队顺序排列的病人信息,包括姓名、年龄、性别、登记时间等。 通过以上步骤,我们可以实现按照老年人优先、按年龄和登记时间排出看病先后顺序,确保老年人和有急需看病病人能够得到及时治疗。在实际应用中,我们可以通过界面设计和交互方式等手段,增强程序的易用性和人性化,进一步提高病人看病的效率和体验。 ### 回答3: 编写一个病人登记看病程序的主要任务是根据题目中的原则进行排序。以下是实现该程序的步骤: 1. 定义病人的数据结构,包括病人姓名、年龄、性别和登记时间等信息。 2. 创建一个病人登记队列,并且在队列中加入所有病人的信息。 3. 为了按照原则进行排序,程序需要先将病人队列分为两部分:老年人和非老年人。 4. 对于老年人部分,按照年龄从大到小的顺序排序,如果年龄相同,则按照登记先后顺序进行排序。 5. 对于非老年人部分,按照登记先后顺序进行排序。 6. 最后,将老年人和非老年人部分合并,优先安排老年人的看病顺序。 7. 等待医生按照顺序叫号就诊。 下面是一个示例代码: ``` #include <iostream> #include <queue> #include <string> using namespace std; struct Patient { string name; // 姓名 int age; // 年龄 char gender; // 性别 string time; // 登记时间 }; // 自定义比较器 struct cmp { bool operator() (const Patient& p1, const Patient& p2) const { if (p1.age >= 60 && p2.age >= 60) { // 如果两个病人都是老年人 if (p1.age == p2.age) // 年龄相同按照登记先后顺序排列 return p1.time > p2.time; else // 年龄从大到小排序 return p1.age < p2.age; } else if (p1.age >= 60 && p2.age < 60) { // 如果p1是老年人,p2是非老年人 return true; } else if (p1.age < 60 && p2.age >= 60) { // 如果p1是非老年人,p2是老年人 return false; } else { // 如果两个病人都是非老年人,按照登记先后顺序排列 return p1.time > p2.time; } } }; int main() { // 创建一个病人登记队列 priority_queue<Patient, vector<Patient>, cmp> q; // 加入所有病人的信息 q.push(Patient{"张三", 60, 'M', "2022-01-01 10:05:00"}); q.push(Patient{"李四", 65, 'F', "2022-01-01 10:10:00"}); q.push(Patient{"王五", 55, 'M', "2022-01-01 10:15:00"}); q.push(Patient{"赵六", 70, 'F', "2022-01-01 10:20:00"}); q.push(Patient{"钱七", 50, 'M', "2022-01-01 10:25:00"}); q.push(Patient{"孙八", 58, 'F', "2022-01-01 10:30:00"}); q.push(Patient{"周九", 75, 'M', "2022-01-01 10:35:00"}); q.push(Patient{"吴十", 57, 'F', "2022-01-01 10:40:00"}); // 按照顺序叫号 int i = 1; while (!q.empty()) { Patient p = q.top(); q.pop(); cout << "第" << i << "个病人:" << p.name << " (" << p.age << "岁)"; if (p.age >= 60) cout << " [老年人]"; cout << endl; i++; } return 0; } ``` 以上程序使用了 STL 的优先队列数据结构,并且自定义了比较器 cmp,用于按照原则进行排序。在实际应用中,程序可能需要根据不同的医院流程进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

漆黑の莫莫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值