专栏文章

B2160 病人排队

B2160题解参与者 13已保存评论 12

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
12 条
当前快照
1 份
快照标识符
@mip6ra9z
此快照首次捕获于
2025/12/03 07:04
3 个月前
此快照最后确认于
2025/12/03 07:04
3 个月前
查看原文
欢迎报名洛谷网校,期待和大家一起进步!
本题考察结构体,排序。
我们使用结构体存储每位病人的信息:字符串 id 表示病人的 ID,整数 ag 表示病人的年龄,整数 rk 表示登记顺序(越小越早):
CPP
struct P {
    string id;
    int ag;
    int rk;
};
本题的关键在于排序规则。对于第 ii 个人和第 jj 个人来说:
  • 如果 ii 不是老年人,而 jj 是老年人,则需要交换;
  • 如果 i,ji,j 都是老年人,则当下列:
    • ii 的年龄小于 jj
    • iijj 年龄相等,但是 ii 来的比 jj
      两个条件满足其一,则需要交换;
使用冒泡排序的参考代码:
CPP
for (int i = 1; i <= n-1; ++i) {
    for (int j = 1; j <= n-i; ++j) {
        bool sw = false;
        bool sen1 = (a[j].ag >= 60);
        bool sen2 = (a[j+1].ag >= 60);
        if (sen2 && !sen1)
            sw = true;
        else if (sen1 && sen2) {
            if (a[j].ag < a[j+1].ag) sw = true;
            else if (a[j].ag == a[j+1].ag && a[j].rk > a[j+1].rk)
                sw = true;
        }
        if (sw)
            swap(a[j], a[j+1]);
    }
}
如果使用 sort 进行结构体排序,则参考的自定义比较函数如下:
CPP
bool cmp(P x, P y) {
    bool sx = (x.ag >= 60);
    bool sy = (y.ag >= 60);
    if (sx != sy) return sx;
    if (sx && sy) {
        if (x.ag != y.ag) return x.ag > y.ag; 
        return x.rk < y.rk;
    }
    return x.rk < y.rk;
}

评论

12 条评论,欢迎与作者交流。

正在加载评论...