时间限制: 1000 ms 内存限制: 65536 KB
提交数: 3105 通过数: 1213
【题目描述】
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
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
【来源】
No
【代码】
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
struct bingren
{
string id; //记录id
int age; //记录年龄
int que; //记录登记先后顺序
}b[202];
bingren t;
int n,q=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>b[i].id>>b[i].age;
q++;
b[i].que=q; //记录谁先输入
}
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(b[i].age>=60&&b[i].age<b[j].age) //对年龄大于60岁的进行排序
{
t=b[i];
b[i]=b[j];
b[j]=t;
}
else if(b[i].age==b[j].age&&b[i].que>b[j].que) //如果年龄相同,按登记先后顺序排序
{
t=b[i];
b[i]=b[j];
b[j]=t;
}
}
}
for(int i=0;i<n;i++) //先输入年龄大于60
{
if(b[i].age>=60)
{
cout<<b[i].id<<endl;
}
}
for(int i=0;i<n;i++) //后输入年龄小于60
{
if(b[i].age<60)
{
cout<<b[i].id<<endl;
}
}
return 0;
}
【解题思路】
这道题有很多解题思路,我没有按照题目那样来解题,因为登记先后顺序不需要进行排序,只用不管就行,所以只要对年龄>=60的进行排序即可,由于在排序的时候可能将登记顺序弄乱了,所以要对老年人年龄相等的进行登记顺序先后进行排序,最后先输入老年人再输入年轻人即可