信息学奥赛一本通C++语言——1183:病人排队
【题目描述】
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
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:病人排队相关推荐
- 信息学奥赛一本通C++语言-----1120:同行列对角线的格
[题目描述] 输入三个自然数nn,ii,j(1≤i≤n,1≤j≤n)j(1≤i≤n,1≤j≤n),输出在一个n×nn×n格的棋盘中(行列均从11开始编号),与格子(ii,jj)同行.同列.同一对角线的 ...
- 信息学奥赛一本通C++语言-----1064:奥运奖牌计数
[题目描述] 2008年北京奥运会,A国的运动员参与了n天的决赛项目(1≤n≤17).现在要统计一下A国所获得的金.银.铜牌数目及总奖牌数.输入第1行是A国参与决赛项目的天数n,其后n行,每一行是该国 ...
- 信息学奥赛一本通C++语言-----2036:【例5.3】开关门
[题目描述] 宾馆里有n(2≤n≤1000)n(2≤n≤1000) 个房间,从1∼n1∼n 编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22 的倍数的房间"相反处理& ...
- 信息学奥赛一本通C++语言-----1087:级数求和
[题目描述] 已知:Sn=1+12+13+-+1nSn=1+12+13+-+1n.显然对于任意一个整数kk,当nn足够大的时候,SnSn大于kk.现给出一个整数k(1<=k<=15)k(1 ...
- 信息学奥赛一本通C++语言-----1097:画矩形
[题目描述] 根据参数,画出矩形.输入四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于3行不多于10行,宽不少于5列不多于10列):第三个参数是一个字符,表示用来画图的矩形符号:第四个参数为 ...
- 信息学奥赛一本通C++语言-----2048:【例5.18】串排序
[题目描述] 对给定的n(1≤n≤20)n(1≤n≤20)个国家名(国家名字长度不超过2020),按其字母的顺序输出. [输入] 第一行为国家的个数nn: 以下nn行为国家的名字. [输出] nn行, ...
- 信息学奥赛一本通C++语言-----1103:陶陶摘苹果
[题目描述] 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在已知 ...
- 信息学奥赛一本通C++语言-----1124:矩阵加法
[题目描述] 输入两个nn行mm列的矩阵AA和BB,输出它们的和A+BA+B. [输入] 第一行包含两个整数nn和mm,表示矩阵的行数和列数(1≤n≤100,1≤m≤100)1≤n≤100,1≤m≤1 ...
- 信息学奥赛一本通C++语言——1075:药房管理
[题目描述] 随着信息技术的蓬勃发展,医疗信息化已经成为医院建设中必不可少的一部分.计算机可以很好地辅助医院管理医生信息.病人信息.药品信息等海量数据,使工作人员能够从这些机械的工作中解放出来,将更多 ...
最新文章
- 网络工作室暑假后第二次培训资料(SQLServer存储过程和ADO.NET访问存储过程)整理(一)...
- netty权威指南学习笔记五——分隔符和定长解码器的应用
- 折线插值_使用地形转栅格插值工具创建水文高程表面
- 学了近一个月的java web 感想
- git gui管理服务器配置文件,从 Git Gui 管理的Repository(库) 提交更改到 Bonobo服务器管理的Repository(库)...
- 在后台查看product的change history
- 他不怕被拒绝_不怕被拒绝,这几大星座男追人时最有耐心
- 老调重弹:对kvo的封装思路
- 化学分子的溶解度预测模型(Rdkit构建)
- ESET NOD32 Antivirus – 免费 3个月/ 3PC
- @RequestParam使用
- matlab MinGW-w64 C/C++ Compiler 的配置(附百度云下载资源)
- 『ML笔记』梯度下降法和随机梯度下降法和小批量梯度对比
- PMP思维导图 | 项目管理知识体系指南
- 忍者必须死3 通关 服务器维护,忍者必须死3进不去怎么办 进不去解决方法详解[多图]...
- 【Spring Cloud 2】软件架构设计,Java游戏合集百度云盘
- 如何查询土地规划用途_“土地调查云”——一款可以详细查询土地征收相关信息的“神器”!...
- 使用QML自绘页面导航条
- 戴尔t410服务器cpu型号,戴尔PowerEdge T410 最新第11代服务器
- 树莓派远程4G遥控车教程(三)-摄像头安装及实现局域网实时监控