题意:
一个公司每月要么盈余,要么亏损,且一年中每个月的盈余是一样的,亏损也是一样的。
财务统计是每五个月统计一次收入总额,即1-5,2-6……8-12,一年共有8次统计结果,并且这八次结果公司都亏损的。给出surplus和deficit,求出全年最大的盈余数。
输入:
每一行包括两个整数 surplus和dificit
输出:
对于每一行输入,输出一个最大的盈余数
解题思路:
典型的贪心算法。要循环8次,把5个月放在一起看,尽可能增加五个月中盈余的月数,即让这五个月在亏损的情况下亏损最少。其实也就以下几种情况:
(1)SSSSD SSSSD SS
(2)SSSDD SSSDD SS
(3)SSDDD SSDDD SS
(4)SDDDD SDDDD SD
感想:
现在真的很头疼这个题意,看明白了题意之后其实这些题目并不难,只是英语学的不到家,题目看不明白,搞不清楚状况,自然是老虎吃鳖,无从下口。代码中被注释掉的部分其实是我第一次提交失败的代码,我感觉这个代码更高级一点,但是提交的时候显示超时了,很无奈啊,有时候自己感觉写的不错的,高级的代码总是有各种各样的问题,但是那些枚举出来的一眼就能看明白的代码却能AC。无奈啊!
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int SurplusPosition(int s, int d)
{
/*int month[12] ,SumSur = 0,total=0 ;
memset(month, 0, sizeof(month));
for (int i = 0; i < 8; i++)
{
while (1)
{
int SumDif = 0;
for (int j = i; j <= i + 4; j++)
SumDif += month[j];
SumSur = 5 - SumDif;
if (SumSur*s > SumDif*d)
{
for (int k = i + 4; k > 0; k--)
{
if (month[k] != 1)
{
month[k] = 1;
break;
}
}
}
else
break;
}
}
SumSur = 0;
for (int l = 0; l < 12; l++)
if (month[l] == 0)
SumSur++;
total = SumSur*s - (12 - SumSur)*d;
*/
int total = 0;
if (4*s < d)
{
total = 10 * s - 2 * d;
}
else
if (3 * s < 2 * d)
{
total = 8 * s - 4 * d;
}
else
if (2 * s < 3 * d)
{
total = 6 * s - 6 * d;
}
else
if (s < 4 * d)
{
total = 3 * s - 9 * d;
}
return total;
}
int main()
{
int Surplus, Deficit, Result = 0;
while (cin >> Surplus >> Deficit)
{
Result = SurplusPosition(Surplus, Deficit);
if (Result <= 0)
{
cout << "Deficit" << endl;
}
else
cout << Result << endl;
}
return 0;
}