洛谷:P5738:歌唱比赛


洛谷:P5738:歌唱比赛

Table of Contents

题目

P5738:歌唱比赛

分析

本题明确说:有n个学生,每个学生都有m个成绩。每个学生的最终成绩都用同一个算法得出。所以,我们应该将这个计算每个学生最终成绩的算法(过程)提炼(“重构”)为一个函数。这个函数很直接:在所有成绩中找到最高分、最低分,同时算出总成绩,再减去最高分和最低分即可。

int getFinalScore(vector<int> scores)
{
    int mins = 10, maxs = 0;
    int total = 0;

    for (int i = 0; i < scores.size(); i++)
    {
        if (scores[i] < mins)
        {
            mins = scores[i];
        }
        if (maxs < scores[i])
        {
            maxs = scores[i];
        }
        total += scores[i];
    }

    return total - mins - maxs;
}

注意,我们这里用STL中的vector来传递包含成绩的数组,所以不用额外传递一个表示数组大小的参数,而是可以在函数内部用scores.size()得到。

对于n个学生,我们输入每个学生的m个成绩,调用getFinalScore获得最终成绩,然后“打擂台”保存最高的成绩。

for (int i = 1; i <= n; i++)
{
    vector<int> scores(m, 0);
    for (int j = 0; j < m; j++)
    {
        cin >> scores[j];
    }
    max_score = max(max_score, getFinalScore(scores));
}

最后,按照题目要求输出。(你当然不会忘记,整数除以整数的结果是一个整数,对吧?所以我们要先用1.0乘以最高分而得到一个浮点数。)

答案

Solution

思考

我们声明的函数,在传递参数时用的是传值传递:int getFinalScore(vector<int> scores),也就是说在主程序调用这个函数并传递scores的时候,会拷贝一份传过去。

按照C++的最佳实践,最好的声明方法是int getFinalScore(const vector<int> &scores),也就是传递一个const的引用。这样我们可以避免传值(因为是引用传递),且保证原始数据不被修改(因为是const引用)。这样的传递方式和函数声明属于高级内容,在竞赛时一般不用考虑。

另外,我们没有对m进行检查。万一m<=2怎么办?题目中没有给出m的取值范围,但从代码最终能AC来看,显然这个边界情况在测试数据中不会出现。

Previous Next