1 条题解

  • 0
    @ 2025-5-6 5:22:40

    解题思路:

    题目要求判断MS公司1999年是否必然亏损,或在满足所有连续55个月亏损的条件下,计算可能的最大盈余。关键在于分析每月盈余(s)和亏损(d)的组合,使得所有88个连续55个月的段总和为负,同时全年总和最大。

    关键步骤:

    1. 约束条件分析

      • 每个连续55个月的段总和必须为负,即对于任意连续55个月,盈余次数a需满足:
        as5ad<0,a<5d/(s+d)a*s-(5-a)*d<0,a<5*d/(s+d)
      • 根据s和d的不同比例,推导出不同的最优解。
    2. 条件分支判断

      • 条件1:当 d>4sd > 4s 时,每个段最多允许11次亏损。最优解为全年1010个月盈余、22个月亏损,总和为 10s2d10s - 2d
      • 条件2:当 2d>3s2d > 3s 时,每个段最多允许2次亏损。最优解为88个月盈余、44个月亏损,总和为 8s4d8s - 4d
      • 条件3:当 3d>2s3d > 2s 时,每个段最多允许3次亏损。最优解为66个月盈余、66个月亏损,总和为 6s6d6s - 6d
      • 条件4:当 4d>s4d > s 时,每个段最多允许44次亏损。最优解为33个月盈余、99个月亏损,总和为 3s9d3s - 9d
      • 若以上条件均不满足,则无法满足所有段亏损,输出"Deficit"。
    3. 结果判断

      • 计算各条件下的最大盈余,若结果为正则输出,否则输出"Deficit"。

    代码解释:

    • 输入s和d后,依次判断四个条件,计算对应的最大盈余。
    • 若所有条件均不满足,或计算结果非正,则输出"Deficit"。

    C++实现:

    #include<iostream>
    using namespace std;
    
    int main() {
        long long s, d;
        while (cin >> s >> d) {
            long long ans = -1;
            // 条件1:d > 4s → 10s-2d
            if (d > 4 * s) {
                ans = 10 * s - 2 * d;
            } 
            // 条件2:2d > 3s → 8s-4d
            else if (2 * d > 3 * s) {
                ans = 8 * s - 4 * d;
            } 
            // 条件3:3d > 2s → 6s-6d
            else if (3 * d > 2 * s) {
                ans = 6 * s - 6 * d;
            } 
            // 条件4:4d > s → 3s-9d
            else if (4 * d > s) {
                ans = 3 * s - 9 * d;
            } 
            // 其他情况无法满足条件
            else {
                ans = -1;
            }
            // 输出结果
            if (ans > 0) {
                cout << ans << endl;
            } else {
                cout << "Deficit" << endl;
            }
        }
        return 0;
    }
    
    • 1

    信息

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