“A公司的烦恼”问题

问题描述

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个月的亏损盈利情况,即可解题。

解题步骤如下:

  1. 计算出连续的5个月至少有哪几个月是亏损的。
  2. 根据贪心的思想,计算全年的盈亏。注意,当至少亏损月份为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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值