1 条题解

  • 0
    @ 2025-8-24 21:54:33

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar StudyingFather
    在纷繁杂乱的世界里,独自寻找属于自己的光荣与梦想。

    搬运于2025-08-24 21:54:32,当前版本为作者最后更新于2020-08-25 01:50:33,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    本题的要求已经说的足够清楚了,直接将输入的三个分数代入总分公式即可计算所求的总成绩。

    于是可以得到下面的代码。

    #include <stdio.h>
    int a, b, c, score;
    int main() {
      scanf("%d%d%d", &a, &b, &c);
      score = a * 0.2 + b * 0.3 + c * 0.5;
      printf("%d", score);
      return 0;
    }
    

    然而,这份代码存在一些问题。在部分机器上,上面的程序对于样例 2 的输入会得到 78 的结果,与样例输出不符。

    这是因为 浮点运算存在误差。限于篇幅,本题解将不再详细展开浮点误差的内容,感兴趣的读者可以点击前面的链接了解相关知识。

    事实上,本题输入数据的特殊性质可以让我们避免浮点运算,从而得到准确的结果。将原式稍微改写一下得到:

    $$\begin{aligned} \textit{score} &=a \times 0.2 + b \times 0.3 + c \times 0.5\\ &=(a \times 2 + b \times 3 + c \times 5) \div 10 \end{aligned} $$

    而数据范围里提到了 a,b,ca,b,c 均为 1010 的倍数,这样所有运算都可以在整数下进行,避免了浮点误差造成的结果不准确。

    #include <stdio.h>
    int a, b, c, score;
    int main() {
      scanf("%d%d%d", &a, &b, &c);
      score = (a * 2 + b * 3 + c * 5) / 10;
      printf("%d", score);
      return 0;
    }
    
    • 1

    信息

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