转载请注明出处:優 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 }