【题目描述】
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:

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

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

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

【输入】
第1行,输入一个小于100的正整数,表示病人的个数;

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

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

【输入样例】
5
021075 40
004003 15
010158 67
021033 75
102012 30
【输出样例】
021033
010158
021075
004003
102012
【源代码】
方法一:稳定排序(归并排序算法)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define SIZEN 110
struct patient {char id[12];int age;
};
void merge_sort(patient *arr, patient *tmp,  const int s, const int e);//定义归并排序函数
int main() {int n;char pid[12];int num,op=0,ns=0;patient old_people[SIZEN],non_senile[SIZEN];memset(non_senile,0,sizeof(non_senile));memset(old_people,0,sizeof(old_people));cin>>n;for(int i=0; i<n; i++) {cin>>pid;cin>>num;if(num>=60) {//大于60岁放入老年人old_people[op].age=num;strcpy(old_people[op].id,pid);op++;} else {//否则放入非老年人non_senile[ns].age=num;strcpy(non_senile[ns].id,pid);ns++;}}patient old_tmp[SIZEN];//临时数组merge_sort(old_people,old_tmp,0,op-1);//调用归并排序函数for(int i=op-1; i>=0; i--) {cout<<old_people[i].id<<endl;//老年人优先,按年龄从大到小}for(int i=0; i<ns; i++) {cout<<non_senile[i].id<<endl;//非老年人按录入顺序}return 0;
}
void merge_sort(patient *arr, patient *tmp,  const int s, const int e) {if (s >= e) return;//start必须比end小,只有一个元素,直接返回int m = (s+e)/2;//计算middle,向下取整  /**分解 Divide**/merge_sort(arr, tmp,  s, m);//递归左序列merge_sort(arr,tmp, m+1, e);//递归右序列int i = s,j = m + 1;//左边index i 左边index j /**合并 Merge**/int t = s;//临时数组index kwhile (i <= m && j <= e)//按照年龄排序,从大到小tmp[t++] = (arr[i].age < arr[j].age) ? arr[i++] : arr[j++];while (i <= m) tmp[t++] = arr[i++]; //复制左边剩余while (j <= e) tmp[t++] = arr[j++];//复制右边剩余for (t = s; t <= e; t++) {   /**复制回原数组**/arr[t] = tmp[t];}
}

方法二:稳定排序(冒泡排序算法)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define SIZEN 110
struct patient {char id[12];int age;
};
void bubble_sort(patient *arr, const int len);//定义冒泡排序函数
int main() {int n;char pid[12];int num,op=0,ns=0;patient old_people[SIZEN],non_senile[SIZEN];memset(non_senile,0,sizeof(non_senile));memset(old_people,0,sizeof(old_people));cin>>n;for(int i=0; i<n; i++) {cin>>pid;cin>>num;if(num>=60) {//大于60岁放入老年人old_people[op].age=num;strcpy(old_people[op].id,pid);op++;} else {//否则放入非老年人non_senile[ns].age=num;strcpy(non_senile[ns].id,pid);ns++;}}bubble_sort(old_people,op);//调用冒泡排序函数for(int i=0; i<op; i++)  {cout<<old_people[i].id<<endl;//老年人优先,按年龄从大到小}for(int i=0; i<ns; i++) {cout<<non_senile[i].id<<endl;//非老年人按录入顺序}return 0;
}
void bubble_sort(patient *arr, const int len) {//冒泡排序算法bool ok;//是否有序的标志for(int i=len-1; i>=0; i--) {//从右向左轮询ok=true;for(int j=0; j<i; j++) {//从左向右冒泡if(arr[j].age<arr[j+1].age) {//从大到小排序swap(arr[j],arr[j+1]);ok=false;}}if(ok) break;}return;
}

方法三:稳定排序(插入排序算法)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define SIZEN 110
struct patient {char id[12];int age;
};
void insert_sort(patient *arr, const int len);//定义插入排序函数
int main() {int n;char pid[12];int num,op=0,ns=0;patient old_people[SIZEN],non_senile[SIZEN];memset(non_senile,0,sizeof(non_senile));memset(old_people,0,sizeof(old_people));cin>>n;for(int i=0; i<n; i++) {cin>>pid;cin>>num;if(num>=60) {//大于60岁放入老年人op++;old_people[op].age=num;strcpy(old_people[op].id,pid);} else {//否则放入非老年人ns++;non_senile[ns].age=num;strcpy(non_senile[ns].id,pid);}}insert_sort(old_people,op);//调用插入排序函数for(int i=1; i<=op; i++) {cout<<old_people[i].id<<endl;//老年人优先,按年龄从大到小}for(int i=1; i<=ns; i++) {cout<<non_senile[i].id<<endl;//非老年人按录入顺序}return 0;
}
void insert_sort(patient *arr, const int len) {//插入排序算法int i,j;for(i=2; i<=len; i++) {//默认第1个元素有序arr[0]=arr[i];//arr[0]作为哨兵sentinelfor(j=i-1; arr[j].age<arr[0].age; j--) {//arr[0]作为哨兵,不需要判断j>=0 arr[j+1]=arr[j];//后移}if(j!=i-1)arr[j+1]=arr[0];//插入}return;
}

方法四:不稳定排序(测试时有可能通不过,这里仅展示不稳定排序)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct patient {char id[10];int age;
};
void selectsort(patient *arr,int n);//定义选择排序函数
int main() {int n;char pid[12];int num,op=0,ns=0;patient old_people[110],non_senile[110];
//  memset(non_senile,0,sizeof(non_senile));
//  memset(old_people,0,sizeof(old_people));cin>>n;for(int i=0; i<n; i++) {cin>>pid;cin>>num;if(num>=60) {//大于60岁放入老年人old_people[op].age=num;strcpy(old_people[op].id,pid);op++;} else {//否则放入非老年人non_senile[ns].age=num;strcpy(non_senile[ns].id,pid);ns++;}}selectsort(old_people,op);//调用选择排序函数for(int i=0; i<op; i++) {cout<<old_people[i].id<<endl;//老年人优先,按年龄从大到小}for(int i=0; i<ns; i++) {cout<<non_senile[i].id<<endl;//非老年人按录入顺序}return 0;
}
void selectsort(patient *arr,int n) {//选择排序函数int x;for(int i=0; i<n; i++) {x=i;for(int j=i+1; j<n; j++) {if(arr[j].age>arr[x].age) {//按年龄从大到小排序x=j;}}if(x!=i) {swap(arr[i],arr[x]);}}return;
}

信息学奥赛一本通C++语言——1183:病人排队相关推荐

  1. 信息学奥赛一本通C++语言-----1120:同行列对角线的格

    [题目描述] 输入三个自然数nn,ii,j(1≤i≤n,1≤j≤n)j(1≤i≤n,1≤j≤n),输出在一个n×nn×n格的棋盘中(行列均从11开始编号),与格子(ii,jj)同行.同列.同一对角线的 ...

  2. 信息学奥赛一本通C++语言-----1064:奥运奖牌计数

    [题目描述] 2008年北京奥运会,A国的运动员参与了n天的决赛项目(1≤n≤17).现在要统计一下A国所获得的金.银.铜牌数目及总奖牌数.输入第1行是A国参与决赛项目的天数n,其后n行,每一行是该国 ...

  3. 信息学奥赛一本通C++语言-----2036:【例5.3】开关门

    [题目描述] 宾馆里有n(2≤n≤1000)n(2≤n≤1000) 个房间,从1∼n1∼n 编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22 的倍数的房间"相反处理& ...

  4. 信息学奥赛一本通C++语言-----1087:级数求和

    [题目描述] 已知:Sn=1+12+13+-+1nSn=1+12+13+-+1n.显然对于任意一个整数kk,当nn足够大的时候,SnSn大于kk.现给出一个整数k(1<=k<=15)k(1 ...

  5. 信息学奥赛一本通C++语言-----1097:画矩形

    [题目描述] 根据参数,画出矩形.输入四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于3行不多于10行,宽不少于5列不多于10列):第三个参数是一个字符,表示用来画图的矩形符号:第四个参数为 ...

  6. 信息学奥赛一本通C++语言-----2048:【例5.18】串排序

    [题目描述] 对给定的n(1≤n≤20)n(1≤n≤20)个国家名(国家名字长度不超过2020),按其字母的顺序输出. [输入] 第一行为国家的个数nn: 以下nn行为国家的名字. [输出] nn行, ...

  7. 信息学奥赛一本通C++语言-----1103:陶陶摘苹果

    [题目描述] 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在已知 ...

  8. 信息学奥赛一本通C++语言-----1124:矩阵加法

    [题目描述] 输入两个nn行mm列的矩阵AA和BB,输出它们的和A+BA+B. [输入] 第一行包含两个整数nn和mm,表示矩阵的行数和列数(1≤n≤100,1≤m≤100)1≤n≤100,1≤m≤1 ...

  9. 信息学奥赛一本通C++语言——1075:药房管理

    [题目描述] 随着信息技术的蓬勃发展,医疗信息化已经成为医院建设中必不可少的一部分.计算机可以很好地辅助医院管理医生信息.病人信息.药品信息等海量数据,使工作人员能够从这些机械的工作中解放出来,将更多 ...

最新文章

  1. 网络工作室暑假后第二次培训资料(SQLServer存储过程和ADO.NET访问存储过程)整理(一)...
  2. netty权威指南学习笔记五——分隔符和定长解码器的应用
  3. 折线插值_使用地形转栅格插值工具创建水文高程表面
  4. 学了近一个月的java web 感想
  5. git gui管理服务器配置文件,从 Git Gui 管理的Repository(库) 提交更改到 Bonobo服务器管理的Repository(库)...
  6. 在后台查看product的change history
  7. 他不怕被拒绝_不怕被拒绝,这几大星座男追人时最有耐心
  8. 老调重弹:对kvo的封装思路
  9. 化学分子的溶解度预测模型(Rdkit构建)
  10. ESET NOD32 Antivirus – 免费 3个月/ 3PC
  11. @RequestParam使用
  12. matlab MinGW-w64 C/C++ Compiler 的配置(附百度云下载资源)
  13. 『ML笔记』梯度下降法和随机梯度下降法和小批量梯度对比
  14. PMP思维导图 | 项目管理知识体系指南
  15. 忍者必须死3 通关 服务器维护,忍者必须死3进不去怎么办 进不去解决方法详解[多图]...
  16. 【Spring Cloud 2】软件架构设计,Java游戏合集百度云盘
  17. 如何查询土地规划用途_“土地调查云”——一款可以详细查询土地征收相关信息的“神器”!...
  18. 使用QML自绘页面导航条
  19. 戴尔t410服务器cpu型号,戴尔PowerEdge T410 最新第11代服务器
  20. 树莓派远程4G遥控车教程(三)-摄像头安装及实现局域网实时监控

热门文章

  1. 成绩不高?校园招聘了解一下!春招公司大全!
  2. 《数字图像处理》学习总结及感悟:第二章数字图像基础(1)人眼结构、感知和错觉
  3. C语言函数实现ascii码快速查询
  4. SQL Developer连接时报错:ORA-12528
  5. 网上流量卡这么便宜,线上申请的流量卡有虚标吗
  6. MEMS智能传感器技术的新进展
  7. Discuz x2 数据字典
  8. 16、Mediator 仲裁者模式
  9. 一线互联网企业高级Android工程师面试题大全,含小米、腾讯、阿里
  10. 封装PC端使用海康插件播放摄像头直播流(基于VUE)