POJ-2586 Y2K Accounting Bug貪心,區間盈利
阿新 • • 發佈:2018-04-03
urn 思路 區間 問題 long 利潤 -s ios 暴力
題目鏈接:
https://vjudge.net/problem/POJ-2586
題目大意:
MS公司(我猜是微軟)遇到了千年蟲的問題,導致數據大量數據丟失。比如財務報表。現在知道這個奇特的公司每個月不是盈利就是虧損(廢話),而且無論是盈利和虧損都有一個定值(虧少了它還不幹
)。經過ACM組織的分析,在一年中任意連續的5個月,它都是虧損的,但是全年就不一定虧損了。現在給你盈利和虧損的定值s和d,請求出它一年能得到的最大利潤!如果虧了,就輸出Deficit!
思路:
一開始暴力一發,枚舉12個月的狀態,TLE。應該貪心,
每五個連續的月一定虧損,我們可以設每五個月虧損月數最少為x,這種情況下,如果x能保證讓這五個月為虧損,這是滿足題意的盈利最大值!
x只能為1,2,3,4,5。
在保證連續5個月都虧損的前提下,使得每5個月中虧損的月數最少。根據d和s的不同五種情況
x=1: ssssd,ssssd,ss d>4s 贏利10個月 10s-2d x=2: sssdd,sssdd,ss 2d>3s 贏利8個月 8s-4d x=3: ssddd,ssddd,ss 3d>2s 贏利6個月 6s-6d x=4: sdddd,sdddd,sd 4d>s 贏利3個月 3s-9d x=5: ddddd,ddddd,dd 4d<s 無贏利
然後直接判斷輸出即可
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 typedef long long ll; 8 int s, d; 9 10 int main() 11 { 12 while(cin >> s >> d) 13 { 14 ll ans; 15 //如果四個月盈利小於一個月虧損 ssssdssssdss 答案是10s-2d 16 if(4 * s < d)ans = 10 * s - 2 * d; 17 //如果三個月盈利小於兩個月虧損 sssddsssddss 答案是8s-4d 18 else if(3 * s < 2 * d)ans = 8 * s - 4 * d; 19 //如果兩個月盈利小於三個月虧損 ssdddssdddss 答案是6s-6d 20 else if(2 * s < 3 * d)ans = 6 * s - 6 * d; 21 //如果一個月盈利小於四個月虧損 sddddsddddsd 答案是3s-9d 22 else if(1 * s < 4 * d)ans = 3 * s - 9 * d; 23 //如果一個月盈利大於四個月虧損 dddddddddddd 答案是虧損 24 else ans = -1; 25 if(ans < 0)cout<<"Deficit"<<endl; 26 else cout<<ans<<endl; 27 28 } 29 return 0; 30 }
POJ-2586 Y2K Accounting Bug貪心,區間盈利