1 条题解

  • 0
    @ 2025-8-24 21:17:00

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 一扶苏一
    休息结束。邮箱 yifusuyi@qq.com

    搬运于2025-08-24 21:16:59,当前版本为作者最后更新于2024-12-18 21:32:50,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    [语言月赛 202412] 吃饭大赛总决赛 题解

    Source & Knowledge

    本题来源于 2024 年 12 月的语言月赛,主要考察结构体、数组以及逻辑判断的使用。

    文字题解

    【结构体定义】
    我们采用这样一个结构体来维护一支队伍的信息

    struct Team {
      string name;
      string number[3];
    
      Team(string x, string y, string z, string w) {
        name = x;
        number[0] = y;
        number[1] = z;
        number[2] = w;
      }
    
      Team() {}
    }
    

    【数据读入】
    我们用 Team rank[i][j] 这个数据表示第 jj 场比赛的 第 ii 名,根据题意读入信息并存储到数组里:

    std::cin >> n >> m >> t >> k;
    for (int i = 1; i <= n; ++i) {
      std::string a, b, c, d;
      int x, y;
      std::cin >> a >> b >> c >> d >> x >> y;
      rank[y][x] = Team(a, b, c, d);
    }
    

    【数据存储】
    为了判定每个人是否已经晋级 ec,我们用一个数组 string ecNumber[5000] 来存储所有当前已经晋级 ec 的队员姓名,int ecNumberCnt 表示当前晋级的人员数量;Team ecTeam[5000] 来存储当前所有晋级 ec 的队伍信息,int ecCnt 来存储当前晋级的队伍数量。

    接下来,按题意先枚举排名,再枚举比赛编号,判断每支队伍是否可以晋级

    for (int i = 1; i <= t; ++i) {
      for (int j = 1; j <= m; ++j) if (rank[i][j].name.size() != 0) { // name 的长度不是 0 说明这里有队伍信息
        if (ecCnt >= k) break;
        bool ok = true;
        for (int u = 0; u < 3; ++u) {
          string x = rank[i][j].number[u];
          for (int t = 0; t < ecNumberCnt; ++t) if (x == ecNumber[t]) { // 遍历晋级人员名单,检查 x 是否已晋级
            ok = false;
          }
        }
        if (!ok) continue; // 有人员晋级则该队伍无法再晋级
        ecTeam[ecCnt++] = rank[i][j];
        for (int u = 0; u < 3; ++u) {
          string x = rank[i][j].number[u];
          ecNumber[ecNumberCnt++] = x;
        }
      }
    }
    

    最后,ecCnt 就是所有晋级的队伍,按规定输出即可。

    • 1

    信息

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