题解:洛谷 P3954 成绩

【题目来源】

洛谷:P3954 [NOIP 2017 普及组] 成绩 - 洛谷

【题目描述】

牛牛最近学习了 C++ 入门课程,这门课程的总成绩计算方法是:

\(总成绩=作业成绩\times 20\%+小测成绩\times 30\%+期末考试成绩\times 50\%\)

牛牛想知道,这门课程自己最终能得到多少分。

【输入】

三个非负整数 \(A,B,C\),分别表示牛牛的作业成绩、小测成绩和期末考试成绩。相邻两个数之间用一个空格隔开,三项成绩满分都是 \(100\) 分。

【输出】

一个整数,即牛牛这门课程的总成绩,满分也是 \(100\) 分。

【输入样例】

100 100 80

【输出样例】

90

【核心思想】

  1. 问题分析:给定三项成绩 \(A, B, C\)(作业、小测、期末),按权重 \(20\%, 30\%, 50\%\) 计算加权总成绩。结果要求为整数,满分 \(100\) 分。

  2. 算法选择

    • 加权求和:直接按公式 \(ans = A \times 0.2 + B \times 0.3 + C \times 0.5\) 计算
    • 浮点转整:C++ 中浮点数赋值给整型变量自动截断小数部分,符合题目输出整数的要求
  3. 关键步骤

    • 读入数据cin >> a >> b >> c 读取三项成绩
    • 加权计算ans = a * 0.2 + b * 0.3 + c * 0.5
      • \(0.2 = 20\%\)\(0.3 = 30\%\)\(0.5 = 50\%\)
      • 浮点乘法后求和,结果自动截断为整数
    • 输出结果cout << ans << endl
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),固定次数的乘法和加法
    • 空间复杂度:\(O(1)\),仅需三个整型变量
  5. 加权计算的核心思想

    • 权重分配:三项成绩按固定比例加权,体现不同考核环节的重要性差异
    • 自动截断特性:C++ 中 int = double 自动截断小数,无需显式取整
    • 浮点运算安全:输入为 \([0, 100]\) 的整数,与 \(0.2, 0.3, 0.5\) 相乘后结果精确表示,无精度损失
    • 适用于加权平均、成绩计算、比例分配类入门问题

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>
using namespace std;
int a, b, c;
int ans;
int main()
{
	cin >> a >> b >> c;  // 输入作业成绩、小测成绩、期末考试成绩
	ans = a * 0.2 + b * 0.3 + c * 0.5;  // 根据题目给出的公式计算结果
	cout << ans << endl;  // 输出结果
	return 0;
}

【运行结果】

100 100 80
90
posted @ 2026-08-05 15:46  团爸讲算法  阅读(14)  评论(0)    收藏  举报