*## 病人排队问题
题目描述
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
1.老年人(年龄 ≥60
岁)比非老年人优先看病。
2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3.非老年人按登记的先后顺序看病。
第1行,输入一个小于100
的正整数,表示病人的个数;
后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10
的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。
按排好的看病顺序输出病人的ID,每行一个。
思路
首先,这是一道排序的题目。我们可以将病人归为两个大类:一个是过了60岁的病人,一个是没过。由于题目的特殊性,我们需要用struct的输入方法来绑定病人的年龄,编号和顺序。在判断病人这一块,我们可以将主要的判断分成3个大类。 (两个病人同时大于60岁,两个病人同时小于60岁,一个大于60一个小于60)(使用bool判断规则函数) 在两个大于60的病人中,我们判断他们年龄大小,(如果相同便要顺序)。在一大一小的判断中,我们只需要找年龄小的。而在两个小于60的病人中,我们则需要用顺序来排序。最后,输出排完序的编号就行。
代码
#include<bits/stdc++.h>
using namespace std;
struct ren
{
string bh;
int nl;
int sx;
} a[110];
int n;
bool sx(ren x1,ren x2)
{
if(x1.nl>=60&&x2.nl>=60)
return x1.nl==x2.nl?x1.sx<x2.sx:x1.nl>x2.nl;
else if(x1.nl<60&&x2.nl<60)
return x1.sx<x2.sx;
else
return x1.nl>x2.nl;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].bh>>a[i].nl;
a[i].sx=i;
}
sort(a+1,a+1+n,sx);
for(int i=1;i<=n;i++)
cout<<a[i].bh<<endl;
return 0;
}