POJ 2586- Y2K Accounting Bug (贪心)
思路: 之前做过一遍这个题目,现在又看了一遍,刚开始没看懂题目,后来才发现要求在每连续555月都亏损的情况下输出最大利润,若某个月盈利则获sss,否则亏损ddd元.
考虑每个月选择盈利还是亏损,根据贪心的思想,我们肯定是优先选择前面的月作为sss,这样后面就能用较少的ddd就能在给较多的表单作贡献,从而放更多的sss.
分类讨论:
1.每个月只有一个d(d>4s)d\ (d>4s)d (d>4s)
ssssdssssdss,ans=10s?2dssssd\ ssssd\ ss,ans=10s-2dssssd ssssd ss,ans=10s?2d
2.每个月两个d(2d>3s)d\ (2d>3s)d (2d>3s)
sssddsssddss,ans=8s?4dsssdd\ sssdd\ ss,ans=8s-4dsssdd sssdd ss,ans=8s?4d
3.每个月333个d(3d>2s)d\ (3d>2s)d (3d>2s)
ssdddssdddss,ans=6s?6dssddd\ ssddd\ ss,ans=6s-6dssddd ssddd ss,ans=6s?6d
4.每个月444个d(4d>s)d\ (4d>s)d (4d>s)
sddddsddddsd,ans=3s?9dsdddd\ sdddd\ sd,ans=3s-9dsdddd sdddd sd,ans=3s?9d
否则输出DeficitDeficitDeficit.
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<sstream>
#include<set>
#include<cmath>
#include<cstdlib>
#include<vector>
typedef long long ll;
using namespace std;
int main(){
ll s,d,ans;while(cin>>s>>d){
ans=-1;if(d>4*s) ans=10*s-2*d;else if(2*d>3*s) ans=8*s-4*d;else if(3*d>2*s) ans=6*s-6*d;else if(4*d>s) ans=3*s-9*d;else ans=-1;if(ans>0) printf("%d\n",ans);else puts("Deficit");}return 0;
}
这是一个经典的后效性贪心问题,即前面的选择会对后面的结果产生影响,因此前面如何选择贪心就是关键.