问题描述
A公司的计算机管理系统受到了千年虫病毒的攻击,因此A公司丢失了向MS公司做年终汇报的数据。
A公司目前掌握的数据是MS公司每次公布的公司盈亏报表,而MS公司公布盈亏的方式与众不同,它每次都是将连续5个月的盈或亏的总和做一次性的发布,因此,A公司不知道每个月具体的盈亏情况。已知的情况是所有盈利月的盈利固定为s,而亏损月的亏损固定为d。
写一个程序,确定MS公司是否盈利,若盈利,那么可能的盈利最大值是多少?
输入:
输入为两个正整数s和d。
输出:
对于每一组的输入数据,若盈利,则输出可能的最大盈利值;若亏损,则输出Deficit。
样例输入:
59 237
375 743
200000 849694
2500000 8000000
样例输出:
116
28
300612
Deficit
解题思路
首先,每连续5个月至少有哪几个月是亏损的是可以计算出来的。
用贪心的思想可以解决如何安排亏损月份的问题;假设5个月至少亏损3个月,那么对前5个月来说,亏损的月份必定是3、4、5月,这样才能保证这3个亏损月能最大可能地被后面连续的5个月利用,以减少出现更多的亏损月。
用贪心思想合理安排12个月的亏损盈利情况,即可解题。
解题步骤如下:
- 计算出连续的5个月至少有哪几个月是亏损的。
- 根据贪心的思想,计算全年的盈亏。注意,当至少亏损月份为4个月和5个月时予以特殊的考虑,其余的情况用通用的公式计算盈亏。
参考代码
#include <iostream>
using namespace std;
int main()
{
int s, d;
while(scanf("%d%d", &s, &d) != EOF)
{
int i, ans;
for(i = 1; i <= 5; i++)
if(s * (5 - i) - d * i < 0)
break; //枚举出5个月中至少有一个亏损月
if(i == 4)
ans = 3 * s - 9 * d;
else
ans = s * (12 - 2 * i) - d * 2 * i; //i = 5时此公式不适用,但可直接判断全年亏损
if(i == 5 || ans < 0) //i = 5这个判断条件必须放在ans < 0前
printf("Deficit\n"):
else
printf("%d\n", ans);
}
}