转载请注明出处:優 YoU http://user.qzone.qq.com/289065406/blog/1299234147
题意比较难懂,其实只要读懂题意,就很简单了。
大意是一个公司在
12
个月中,或固定盈余
s
,或固定亏损
d.
但记不得哪些月盈余,哪些月亏损,只能记得连续
5
个月的代数和总是亏损
(<0
为亏损
)
,而一年中只有
8
个连续的
5
个月,分别为
1~5
,
2~6
,
…
,
8~12
问全年是否可能盈利?若可能,输出可能最大盈利金额,否则输出“
Deficit".
根据经验, 贪心选择往往都在极端处(临界点)选择 。(其实这题不用贪心,单纯枚举也可以AC,因为不同情况实在太少呐。。。。
不难证明,每连续
5
个月中,在保证这
5
个月经营之和为亏损的情况下,亏损的月数肯定应尽量往后选,盈利的月数应尽量往前选。证明省略。
先处理处理完
1~5
月后,剩下的月份可以根据“连续
5
个月经营之和为亏损”这个条件进行确定亏损还是盈利。
本题的贪心选择每次仅仅选取其中一种情况(
1~5
月),因为之后月份无需再选择,所以每次总共只做了一次贪心选择。
实际上 ; 只要讨论 5 种情况即可; ( 任一月固定 盈余s,或固定亏损d).
SSSSDSSSSDSS
4s<d
保证“
连续
5
个月必亏损”,每连续
5
个月种至少
1
个月
D
,
保证可能有全年最大盈余,每连续
5
个月中至多
4
个月
S
SSSDDSSSDDSS
3s<2d
保证“
连续
5
个月必亏损”,每连续
5
个月种至少
2
个月
D
,
保证可能有全年最大盈余,每连续
5
个月中至多
3
个月
S
SSDDDSSDDDSS
2s<3d
保证“
连续
5
个月必亏损”,每连续
5
个月种至少
3
个月
D
,
保证可能有全年最大盈余,每连续
5
个月中至多
2
个月
S
SDDDDSDDDDSD
s<4d
保证“
连续
5
个月必亏损”,每连续
5
个月种至少
4
个月
D
,
保证可能有全年最大盈余,每连续
5
个月中至多
1
个月
S
DDDDDDDDDDDD
s>=4d
保证“
连续
5
个月必亏损”,每连续
5
个月种至少
5
个月
D
,
每月亏损,此情况全年必亏损
要注意的是,前
4
种情况都仅仅是“可能有全年的盈余”,而不是“一定有全年的盈余”。
但是若果一旦有盈余,必定是最大盈余
把
5
种情况可以归纳为关于
s
的判定条件:
0 <= s <1/4d
每连续
5
个月种至少
1
个月
D
1/4d <= s < 2/3d
每连续
5
个月种至少
2
个月
D
2/3d <= s < 3/2d
每连续
5
个月种至少
3
个月
D
3/2d <= s < 4d
每连续
5
个月种至少
4
个月
D
4d <= s
全年各月必亏损
ps:
输入要在注意终止条件为
while(cin>>s>>d)
1
//
Memory Time
2
//
256K 16MS
3
4
5
#include
<
iostream
>
6
using
namespace
std;
7
8
int
main(
void
)
9
{
10
double
s,d;
11
while
(cin
>>
s
>>
d)
12
{
13
bool
flag
=
false
;
14
int
surplus
=
0
;
15
if
(s
>=
4
*
d)
16
flag
=
true
;
17
18
else
if
((s
>=
1.5
*
d)
&&
(s
<
4
*
d))
19
{
20
surplus
=
3
*
s
-
9
*
d;
21
if
(surplus
<
0
)
22
flag
=
true
;
23
}
24
25
else
if
((s
>=
0.666666
*
d)
&&
(s
<
1.5
*
d))
26
{
27
surplus
=
6
*
(s
-
d);
28
if
(surplus
<
0
)
29
flag
=
true
;
30
}
31
32
else
if
((s
>=
0.25
*
d)
&&
(s
<
0.666666
*
d))
33
{
34
surplus
=
8
*
s
-
4
*
d;
35
if
(surplus
<
0
)
36
flag
=
true
;
37
}
38
39
else
if
((s
>=
0
)
&&
(s
<
0.25
*
d))
40
{
41
surplus
=
10
*
s
-
2
*
d;
42
if
(surplus
<
0
)
43
flag
=
true
;
44
}
45
46
if
(flag)
47
cout
<<
"
Deficit
"
<<
endl;
48
else
49
cout
<<
surplus
<<
endl;
50
}
51
return
0
;
52
}

