1. 程式人生 > >POJ-2586 Y2K Accounting Bug貪心,區間盈利

POJ-2586 Y2K Accounting Bug貪心,區間盈利

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貪心,區間盈利