题面

题目描述

n(n100)n(n\le 100) 名同学参加歌唱比赛,并接受 m(m20)m(m\le 20) 名评委的评分,评分范围是 0 到 10 分。这名同学的得分就是这些评委给分中去掉一个最高分,去掉一个最低分,剩下 m2m-2 个评分的平均数。请问得分最高的同学分数是多少?评分保留 2 位小数。

输入格式

输出格式

输入输出样例

输入#1

7 6
4 7 2 6 10 7
0 5 0 10 3 10
2 6 8 4 3 6
6 3 6 7 5 8
5 9 3 3 8 1
5 9 9 3 2 0
5 8 0 4 1 10

输出#1

6.00

思路

既然这道题被归类到 函数与结构体 这个题单里了,那么肯定是要优先用结构体来做的。

但是题解里面貌似都没有用结构体的

首先,我们要定义一个结构体,里面存放各个评委给出的分数、总分数和平均分。

然后写一个初始化函数。 (非必要)

node() {
    memset(this->score, 0x00, sizeof(this->score));
    all = sum = 0.00;
}

再写一个处理函数

void t(int m) {
    for (int i = 0; i < m; i++) {
        cin >> score[i];
    }
    std::sort(score, score + m);
    for (int i = 1; i + 1 < m; i++) {
        sum += score[i];
    }
    all = sum / (m - 2.00);
}

这个处理函数分为了三部分:读入排序按题目要求计算平均分

然后看主函数,读入+处理+排序+输出,一气呵成,完美。

又水了一道小橙题呢

代码

// R38743182

#include <bits/stdc++.h>

using namespace std;

struct node {
    int    score[22];
    double sum, all;

    node() {
        memset(this->score, 0x00, sizeof(this->score));
        all = sum = 0.00;
    }

    void t(int m) {
        for (int i = 0; i < m; i++) {
            cin >> score[i];
        }
        std::sort(score, score + m);
        for (int i = 1; i + 1 < m; i++) {
            sum += score[i];
        }
        all = sum / (m - 2.00);
    }
};

bool cmp(node a, node b) {
    return a.all > b.all;
}

int main() {
    int  n, m;
    node student[105];
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        student[i].t(m);
    }
    sort(student, student + n, cmp);
    printf("%.2lf", student[0].all);
    return 0;
}