1 条题解

  • 0
    @ 2025-10-28 8:41:28

    题目理解

    这是 ROI 2018 平方与立方 问题的解决方案。题目要求计算需要多少个5分才能使平均分四舍五入后不低于4分。

    代码思路解析

    1. 数学建模

    设需要 xx 个5分,则总分为:

    总分=2a+3b+4c+5x\text{总分} = 2a + 3b + 4c + 5x

    总人数为:

    总人数=a+b+c+x\text{总人数} = a + b + c + x

    2. 四舍五入条件

    平均分四舍五入后 4\ge 4 的条件是:

    2a+3b+4c+5xa+b+c+x3.5\frac{2a + 3b + 4c + 5x}{a + b + c + x} \ge 3.5

    因为:

    • 平均分 3.5\ge 3.5 时四舍五入为4
    • 平均分 <3.5< 3.5 时四舍五入为3

    3. 不等式推导

    将条件转化为不等式:

    2a+3b+4c+5x3.5(a+b+c+x)2a + 3b + 4c + 5x \ge 3.5(a + b + c + x)

    两边乘以2:

    4a+6b+8c+10x7a+7b+7c+7x4a + 6b + 8c + 10x \ge 7a + 7b + 7c + 7x

    整理得:

    3x3a+bc3x \ge 3a + b - c

    4. 整数解处理

    由于 xx 必须是整数:

    x3a+bc3x \ge \frac{3a + b - c}{3}

    但要注意:

    • 如果 3a+bc03a + b - c \le 0,说明已经满足条件,x=0x = 0
    • 否则需要向上取整

    5. 代码实现

    std::cout << (3 * a + b - c - 1) / 3 + 1 << "\n";
    

    这个表达式等价于:

    • 3a+bc>03a + b - c > 0 时,计算 3a+bc3\lceil \frac{3a + b - c}{3} \rceil
    • 3a+bc03a + b - c \le 0 时,结果为1(但实际应该是0,这里可能有边界情况处理)

    关键技巧

    1. 四舍五入转化

    将四舍五入条件转化为数学不等式

    2. 分数处理

    通过乘以分母消除分数,避免浮点数运算

    3. 整数运算

    使用整数除法实现向上取整:

    (n - 1) / k + 1  // 等价于 ceil(n/k)
    

    4. 边界处理

    考虑 3a+bc03a + b - c \le 0 的情况

    复杂度分析

    • 时间复杂度:O(1)O(1)
    • 空间复杂度:O(1)O(1)

    正确性验证

    样例验证:

    输入:a=2,b=0,c=0a=2, b=0, c=0 计算:$(3×2 + 0 - 0 - 1) / 3 + 1 = (6-1)/3 + 1 = 5/3 + 1 = 1 + 1 = 2$ 输出:2 ✓

    边界情况:

    • 如果已有足够高分(cc 很大),可能需要0个5分
    • 如果全是低分(aa 很大),需要较多5分

    总结

    这个解法是典型的数学推导问题:

    1. 问题转化:将四舍五入条件转化为数学不等式
    2. 代数推导:通过代数运算得到简洁表达式
    3. 整数处理:使用整数运算避免浮点误差
    4. 边界考虑:处理各种极端情况
    • 1

    信息

    ID
    4346
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者