首页 / c++ / 题解
发表于,更新于

洛谷 p13797 题解

本题思路:

首先第一步要先算出每个队的总得分。然后用 sort 搭配 cmp 进行排序。最后直接输出就行了(非常的简单)。

注意事项:

  • 题目并没有给出 $n$ 的范围,所以建议使用动态数组 vector,但实测队伍数量不超过 $10^5$。
  • 记得储存队伍的顺序,cmp 的时候会用到。

上代码:

#include<bits/stdc++.h>
using namespace std;

struct team {// 队伍结构体 
    string c;
    int sss;
    int i;
    int e[6];
};

bool cmp(const team& a, const team& b) {// 排序函数 
    if (a.sss != b.sss) return a.sss > b.sss;
    return a.i < b.i;
}

int main() {
    int n;
    cin >> n;
    vector<team> v(n);
    string c;
    int p, sss;
    int e[6];
    for (int i = 0; i < n; i++) {
        cin >> c >> p;
        for (int j = 0; j < 6; j++) {
            cin >> e[j];
        }
        
        sort(e, e + 6);
        int sum = 0;
        for (int j = 1; j <= 4; j++) { // 计算蹦床得分:去掉最高和最低的 2 个分数
            sum += e[j];
        }
        
        sss = p * 10 + sum; // 计算编程得分
        v[i] = {c, sss, i, {e[0], e[1], e[2], e[3], e[4], e[5]}};
    }
    sort(v.begin(), v.end(), cmp); // 按总得分排序,如果总得分相同,按输入顺序排序
    int cnt = 0;
    
    // 输出前 3 名队伍
    for (int i = 0; i < n; i++) {
        if (i == 0 || v[i].sss < v[i - 1].sss) {
            cnt = i;
        }
        if (cnt > 2) {
            break;
        }
        cout << v[i].c << " " << v[i].sss << endl;
    }
    return 0;
}

标签: 无

许可协议

本文作者 , 采用 CC-BY-SA-4.0 许可协议,转载请注明出处。

上一篇 没有了

添加新评论