1 条题解
-
0
解题思路:
题目要求判断MS公司1999年是否必然亏损,或在满足所有连续个月亏损的条件下,计算可能的最大盈余。关键在于分析每月盈余(s)和亏损(d)的组合,使得所有个连续个月的段总和为负,同时全年总和最大。
关键步骤:
-
约束条件分析:
- 每个连续个月的段总和必须为负,即对于任意连续个月,盈余次数a需满足:
- 根据s和d的不同比例,推导出不同的最优解。
- 每个连续个月的段总和必须为负,即对于任意连续个月,盈余次数a需满足:
-
条件分支判断:
- 条件1:当 时,每个段最多允许次亏损。最优解为全年个月盈余、个月亏损,总和为 。
- 条件2:当 时,每个段最多允许2次亏损。最优解为个月盈余、个月亏损,总和为 。
- 条件3:当 时,每个段最多允许3次亏损。最优解为个月盈余、个月亏损,总和为 。
- 条件4:当 时,每个段最多允许次亏损。最优解为个月盈余、个月亏损,总和为 。
- 若以上条件均不满足,则无法满足所有段亏损,输出"Deficit"。
-
结果判断:
- 计算各条件下的最大盈余,若结果为正则输出,否则输出"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
- 上传者