轉載請注明出處:優 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 }
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
