【题目链接】

ybt 1183:病人排队
OpenJudge NOI 1.10 08:病人排队

【题目考点】

1. 排序

【君义精讲】排序算法

2. 多关键字排序

方法1:将多关键字的排序条件整合为单一排序条件
方法2:使用稳定的排序算法进行多趟排序

【解题思路】

解法1:老年人和年轻人分别排序

设结构体保存一个人的信息:id和年龄。设两个数组分别保存老年人和年轻人的信息。对保存老年人信息的数组按年龄降序排序,由于年龄相同的要按登记顺序排序,所以要选择稳定的排序算法。而后分别顺序输出两个数组中数组元素的ID。

解法2:整合为一个排序条件

输入时,保存每个人的登记序号(即这是第几个人)
使用sort或stable_sort排序,设比较函数,传入两个人的信息

  • 如果一个是老年人一个是非老年人,老年人排在前
  • 如果两个人都是老年人,那么年龄大的排在前面。如果年龄相同,序号小的排在前面。
  • 如果两个都是非老年人,登记序号小的排在前面。

以上条件可以简化为:

  • 如果两人都是年轻人,或如果两个人都是老年人且年龄相等,那么登记序号小的排在前面。
  • 如果两人年纪不等,无论两人都是老年人,还是一老一少,都应该是年纪更大的排在前面。

【题解代码】

解法1:老年人和非老年人分别排序

  • 使用STL stable_sort函数排序
#include<bits/stdc++.h>
using namespace std;
#define N 105
struct Peo
{char id[10];int age;
};
bool cmp(Peo a, Peo b)
{return a.age > b.age;
}
int main()
{int n, io = 0, iy = 0;//io:old数组中元素个数 iy:young数组中元素个数 cin >> n;Peo old[N], young[N], a;//old:老年人信息 young:年轻人信息 for(int i = 1; i <= n; ++i){cin >> a.id >> a.age;if(a.age >= 60)old[++io] =a;elseyoung[++iy] = a;}stable_sort(old+1, old+1+io, cmp);for(int i = 1; i <= io; ++i)cout << old[i].id << endl;for(int i = 1; i <= iy; ++i)cout << young[i].id << endl;return 0;
}
  • 插入排序
#include<bits/stdc++.h>
using namespace std;
#define N 105
struct Peo
{char id[10];int age;
};
int main()
{int n, io = 0, iy = 0;//io:old数组中元素个数 iy:young数组中元素个数 cin >> n;Peo old[N], young[N], a;//old:老年人信息 young:年轻人信息 for(int i = 1; i <= n; ++i){cin >> a.id >> a.age;if(a.age >= 60)//加入到老年人数组,做插入排序 {old[++io] =a;for(int j = io; j > 1; j--)//插入排序 {if(old[j].age > old[j-1].age)swap(old[j], old[j-1]);elsebreak;}}elseyoung[++iy] = a;}for(int i = 1; i <= io; ++i)cout << old[i].id << endl;for(int i = 1; i <= iy; ++i)cout << young[i].id << endl;return 0;
}

解法2:整合为一个比较条件

  • 使用STL sort函数,记录个人序号,比较函数意义直接
#include<bits/stdc++.h>
using namespace std;
#define N 105
struct Peo
{char id[10];int age, num;//num:序号
};
bool cmp(Peo a, Peo b)
{if(a.age >= 60 && b.age >= 60)//如果都是老人 {if(a.age == b.age)//如果年龄相同 return a.num < b.num;//序号小的在前面elsereturn a.age > b.age;//年龄大的在前面 }else if(a.age < 60 && b.age < 60)//如果都不是老人 return a.num < b.num;//序号小的在前面else//一个老人一个不是老人 return a.age > b.age;//老人年龄大,在前面 }
int main()
{int n;cin >> n;Peo a[N];//a:各人人信息 for(int i = 1; i <= n; ++i){cin >> a[i].id >> a[i].age;a[i].num = i; }sort(a+1, a+1+n, cmp);for(int i = 1; i <= n; ++i)cout << a[i].id << endl;return 0;
}
  • 使用STL stable_sort函数,记录个人序号,更简洁的比较函数
#include<bits/stdc++.h>
using namespace std;
#define N 105
struct Peo
{char id[10];int age, num;//num:序号
};
bool cmp(Peo a, Peo b)
{if(a.age < 60 && b.age < 60 || a.age == b.age)//如果都不是老人 或都是老人且年龄相等 return a.num < b.num;//序号小的排在前面else//至少有一个老人且年龄不等 return a.age > b.age;//无论是两老人还是一老一年轻,都是年纪更大的更靠前
}
int main()
{int n;cin >> n;Peo a[N];//a:各人人信息 for(int i = 1; i <= n; ++i){cin >> a[i].id >> a[i].age;a[i].num = i;}stable_sort(a+1, a+1+n, cmp);for(int i = 1; i <= n; ++i)cout << a[i].id << endl;return 0;
}

信息学奥赛一本通 1183:病人排队 | OpenJudge NOI 1.10 08:病人排队相关推荐

  1. 信息学奥赛一本通 1114:白细胞计数 | OpenJudge NOI 1.9 08

    [题目链接] ybt 1114:白细胞计数 OpenJudge NOI 1.9 08:白细胞计数 [题目考点] 1. 求数组中最大值及其下标 方法1:保存最大值和下标 设置临时最大值变量mx,mx的初 ...

  2. 信息学奥赛一本通 1190:上台阶 | OpenJudge NOI 2.3 3525:上台阶

    [题目链接] ybt 1190:上台阶 OpenJudge NOI 2.3 3525:上台阶 注:ybt 1190最大数据数量为71,而OpenJudge 2.3 3525中最大数据数量为100.如果 ...

  3. 信息学奥赛一本通 1225:金银岛 | OpenJudge NOI 4.6 1797:金银岛

    [题目链接] ybt 1225:金银岛 OpenJudge NOI 4.6 1797:金银岛 [题目考点] 1. 贪心 2. 部分背包问题 [解题思路] 该题为部分背包问题 1. 贪心选择性质的证明: ...

  4. 信息学奥赛一本通 1226:装箱问题 | OpenJudge NOI 4.6 19:装箱问题

    [题目链接] ybt 1226:装箱问题 OpenJudge NOI 4.6 19:装箱问题 [题目考点] 1. 贪心 [解题思路] 该题说是三维立方体,实际上无论是包裹还是产品,高度都是h,因而不用 ...

  5. 信息学奥赛一本通 1216:红与黑 / OpenJudge NOI 2.5 1818

    [题目链接] ybt 1216:红与黑 OpenJudge NOI 2.5 1818:红与黑 [题目考点] 1. 连通块问题 2. 深搜/广搜 [解题思路] 1. 深搜 从第一个格子出发,遍历所有可以 ...

  6. 信息学奥赛一本通 1115:直方图 | OpenJudge NOI 1.9 09

    [题目链接] ybt 1115:直方图 OpenJudge NOI 1.9 09:直方图 [题目考点] 1. 散列存储 也叫哈希存储.其思想为:将要存储的值通过某种算法映射到存储地址,映射算法为散列函 ...

  7. 信息学奥赛一本通 1109:开关灯 | OpenJudge NOI 1.5 31:开关灯

    [题目链接] ybt 1109:开关灯 OpenJudge NOI 1.5 31:开关灯 [题目考点] 1. 模拟 2. 循环.数组 3. 用逗号分隔输出 设标志位:isFirst,表示现在输出的是否 ...

  8. 信息学奥赛一本通 1073:救援 | OpenJudge NOI 1.5 19:救援

    [题目链接] ybt 1073:救援 OpenJudge NOI 1.5 19:救援 [题目考点] 1. 直角坐标系下某点到原点的距离 点(x,y)(x,y)(x,y)到原点的距离d=x2+y2d = ...

  9. 信息学奥赛一本通 1070:人口增长 | OpenJudge NOI 1.5 14:人口增长问题

    [题目链接] ybt 1070:人口增长 OpenJudge NOI 1.5 14:人口增长问题 [题目考点] 1. 循环求幂 设变量r初始值为1:int r = 1; 循环n次每次循环中输入变量a, ...

  10. 信息学奥赛一本通 1060:均值 | OpenJudge NOI 1.5 03

    [题目链接] ybt 1060:均值 OpenJudge NOI 1.5 03:均值 [题目考点] 1. while循环 2. for循环 循环n次的两种写法 for(int i = 0; i < ...

最新文章

  1. Delphi开发的IOCP测试Demo以及使用说明。
  2. 继穿越火线后的又一传奇:Final Approach
  3. 想在PyTorch里训练BERT,请试试Facebook跨语言模型XLM
  4. 时间相差8小时、GMT、UTC、CST、CET关系
  5. CSS3实现页面的平滑过渡
  6. 【Java例题】5.3 线性表的使用
  7. 【数据结构总结】第六章 图(非线性结构)
  8. 数据结构(六)二叉树的遍历(递归非递归方法)
  9. 冗余的阿里云实例开启和停止API
  10. linux常用命令-文件处理命令
  11. 如何借助OpenStack命令行工具管理虚拟机?
  12. ssh中懒加载问题org.hibernate.LazyInitializationException
  13. 工具推荐:最好用的pCap工具
  14. CDO玩“跨界”,数据驱动有戏了!
  15. Java设计模式之装饰器模式 (转)
  16. 您应该了解的云管理知识
  17. 微信图片去除马赛克_微信怎么把图片加上马赛克_微信如何将照片打码的方法介绍_3DM手游...
  18. 32位MD5加密 可用来微信加密
  19. Android Wi-Fi Display(Miracast)介绍
  20. 趣味选择题.html

热门文章

  1. 写给程序员的心理学入门知识(一)
  2. C#顺时针逆时针旋转图片
  3. ctfshow 做题 MISC入门 模块 11-20
  4. 二层交换机、三层交换机和路由器的区别
  5. python ttk separator_Python GUI编程(Tkinter)
  6. linux遇到hint:num lock on
  7. 如何在win10官网下载系统
  8. 计算机移动监控,AI技术和5G技术赋能移动监控领域,加速移动监控产品的迭代...
  9. leetcode算法 森林中的兔子
  10. 女生学计算机专业用考研吗,计算机专业女生考研,该选什么方向比较好?谢谢!...