POJ 2586- Y2K Accounting Bug

POJ 2586- Y2K Accounting Bug (贪心)

思路: 之前做过一遍这个题目,现在又看了一遍,刚开始没看懂题目,后来才发现要求在每连续 5 5 5月都亏损的情况下输出最大利润,若某个月盈利则获 s s s,否则亏损 d d d元.
考虑每个月选择盈利还是亏损,根据贪心的思想,我们肯定是优先选择前面的月作为 s s s,这样后面就能用较少的 d d d就能在给较多的表单作贡献,从而放更多的 s s s.

分类讨论:

1.每个月只有一个 d   ( d > 4 s ) d\ (d>4s) d (d>4s)
s s s s d   s s s s d   s s , a n s = 10 s − 2 d ssssd\ ssssd\ ss,ans=10s-2d ssssd ssssd ss,ans=10s2d
2.每个月两个 d   ( 2 d > 3 s ) d\ (2d>3s) d (2d>3s)
s s s d d   s s s d d   s s , a n s = 8 s − 4 d sssdd\ sssdd\ ss,ans=8s-4d sssdd sssdd ss,ans=8s4d
3.每个月 3 3 3 d   ( 3 d > 2 s ) d\ (3d>2s) d (3d>2s)
s s d d d   s s d d d   s s , a n s = 6 s − 6 d ssddd\ ssddd\ ss,ans=6s-6d ssddd ssddd ss,ans=6s6d
4.每个月 4 4 4 d   ( 4 d > s ) d\ (4d>s) d (4d>s)
s d d d d   s d d d d   s d , a n s = 3 s − 9 d sdddd\ sdddd\ sd,ans=3s-9d sdddd sdddd sd,ans=3s9d
否则输出 D e f i c i t Deficit Deficit.

#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; 
}

这是一个经典的后效性贪心问题,即前面的选择会对后面的结果产生影响,因此前面如何选择贪心就是关键.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷酷的Herio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值