#p1019. 病人排队(程序填空)
病人排队(程序填空)
【问题描述】
病人登记看病,按照以下原则排序:
- 老年人(年龄 >= 60岁)比非老年人优先看病
- 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序
- 非老年人按登记的先后顺序看病
【输入形式】
第一行:病人个数n(小于100的正整数) 后面n行:每行包含病人的ID(长度小于10的字符串)和年龄,用空格隔开
【输出形式】
按排好的看病顺序输出病人的ID,每行一个
Samples
5
021075 40
004003 15
010158 67
021033 75
102012 30
021033
010158
021075
004003
102012
#include<stdio.h>
typedef struct
{
char name[20];
int age;
int id; // 登记顺序
}na;
// 比较函数:返回1表示p应该在q前面
int comp(na p,na q)
{
if(p.age>=60&&q.age<60) return {{FILL}}; // 老年人优先
if(p.age<60&&q.age>=60) return 0; // 老年人优先(题目要求这里返回0)
if(p.age<60&&q.age<60) return {{FILL}}; // 也可以p.id<q.id
if(p.age==q.age) return p.id<q.id; // 年龄相同按登记顺序
return {{FILL}}; // 老年人年龄大的优先
}
void sortup(na a[],int n)
{
na r;
int flag=1;
while(flag)
{
{{FILL}} // 初始化标志位
for(int i=0; i<n-1; i++)
{
// 如果a[i+1]应该在a[i]前面,则交换
if(comp(a[i+1], a[i]))
{
r=a[i];
a[i]=a[i+1];
a[i+1]=r;
flag=1; // 发生了交换,需要继续排序
}
}
}
}
int main()
{
int n;
scanf("%d",&n);
na patient[100];
for(int i=0; i<n; i++)
{
scanf("%s %d", patient[i].name, &patient[i].age);
patient[i].id = i; // 记录登记顺序
}
sortup(patient, n);
for(int i=0; i<n; i++)
{
printf("%s\n", patient[i].name);
}
return 0;
}
Limitation
1s, 1024KiB for each test case.