1 条题解

  • 0
    @ 2025-8-24 21:07:49

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar chen_zhe
    Aya 敲可爱的~

    搬运于2025-08-24 21:07:48,当前版本为作者最后更新于2025-05-28 14:27:38,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    欢迎报名洛谷网校,期待和大家一起进步!

    本题考察结构体,排序。

    我们使用结构体存储每位病人的信息:字符串 id 表示病人的 ID,整数 ag 表示病人的年龄,整数 rk 表示登记顺序(越小越早):

    struct P {
        string id;
        int ag;
        int rk;
    };
    

    本题的关键在于排序规则。对于第 ii 个人和第 jj 个人来说:

    • 如果 ii 不是老年人,而 jj 是老年人,则需要交换;
    • 如果 i,ji,j 都是老年人,则当下列:
      • ii 的年龄小于 jj
      • iijj 年龄相等,但是 ii 来的比 jj
        两个条件满足其一,则需要交换;

    使用冒泡排序的参考代码:

    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 进行结构体排序,则参考的自定义比较函数如下:

    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;
    }
    
    • 1

    信息

    ID
    11817
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    1
    已通过
    0
    上传者