题目描述
小理是个热爱生活的孩子。
病人登记看病,小理想编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
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++要求数组必须是常量值,不能用变量
动态分配
int n;
cin >> n;
int *a=new int[n];
delete[]a;
vector
int n;
cin >> n;
vector <int> a(n);
比赛是不会有这个问题,大都用GCC编译器