#p1019. 病人排队(程序填空)

病人排队(程序填空)

【问题描述】

病人登记看病,按照以下原则排序:

  1. 老年人(年龄 >= 60岁)比非老年人优先看病
  2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序
  3. 非老年人按登记的先后顺序看病

【输入形式】

第一行:病人个数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.