题目描述:
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
分析:看题得知盈利月和亏损月各自的盈利和亏损是固定的,一年只有12个月,它又是每5个月做一次报告,那么一年撑死做两次报告,我们划分为前5个月和后5个月,由于盈利和亏损的值是个固定的,那么实质上前五个月和后五个月本质上是相同的,即后五个月是前五个月的一个复制罢了。关键是要如何安排亏损月和盈利月的位置,假设5个月至少亏损3个月,那么对前五个月来说,亏损的月份必定是3,4,5月份,为什么?前面分析过这两个5月本质是一样的,是前一个的重复,前五个月是ssddd,那后五个月也是是ssddd,剩下的月份就是ss了,达到最大利益,如果是dddss这种情况,那最后剩下的两个月份则为dd,这样无法达到最大利润,用贪心的思想合理排布亏损盈利情况即可解出此题。
#include <iostream>
using namespace std;
const int MAXN = 100005;
int temp[MAXN];
int main()
{
int s, d;
int i;
while(cin >> s >> d)
{
int total = 0;
for(i=1; i<=5; i++)
{
if(s * (5 - i) - d * i < 0)
{
break; //枚举出5个月中至少有i个亏损月
}
}
//i == 5 dddddddddddd 此情况全年赤字
//i == 4 sddddsddddsd
//i == 3 ssdddssdddss
//i == 2 sssddsssddss
//i == 1 ssssdssssdss
if(i == 4)
{
total = 3 * s - 9 * d;
}
else
{
total = (12 - 2 * i) * s - d * 2 * i;
}
if(i == 5 || total < 0)
{
cout << "Deficit" << endl;
}
else
{
cout << total << endl;
}
}
return 0;
}