poj 2586 greedy

#include<iostream>
#include<cstdio>

using namespace std;

int main(){   //貌似代码里默认0元是surplus
    int s,d,surplus;
    while(scanf("%d%d",&s,&d)!=EOF){
        bool flag = false;
        if(s >= 4 * d){
            flag = true;
        }
        else if(s < 4 * d && s >= 1.5*d){
            surplus = 3 * s - 9 * d;
            if(surplus < 0){
                flag = true;
            }
        }
        else if(s < 1.5 * d && d < 1.5 * s){
            surplus = 6 * (s - d);
            if(surplus < 0){
                flag = true;
            }
        }
        else if(d > 1.5 * s && d <= 4 * s){
            surplus = 8 * s - 4 * d;
            if(surplus < 0){
                flag = true;
            }
        }
        else if(d > 4 *s){
            surplus = 10 * s - 2 * d;
            if(surplus < 0){
                flag = true;
            }
        }
        if(flag){
            printf("Deficit\n");
        }
        else{
            printf("%d\n",surplus);
        }
    }
    return 0;
}


题目大意:

这道题的题意比较晦涩,我也是看了网上的翻译才懂(以后不这样了)

有个公司,每个月盈利Or亏损的金额都是固定的(盈利为s,亏损为d),给定s,d

已知一年中任意连续(consecutive)(这个条件还是很容易想当然的)5个月都是亏损的,问这一年总体看来是否可能盈利及可能盈利的最大值

 

 

思路:

为了同时满足任意连续的5个月的盈利为负且总收入尽可能的大,那么亏损的月应该尽可能的向后放

(证明: 为了满足任意5个consecutive months的总盈利为负,1-5、6-10的盈利都为负,

   下面证明在同一组(5个)ss..s d...d(连续个d跟着连续个s可以使得总盈利尽可能的大)

 首先,假设存在一个最优解a1a2...a12(ai = s or d , i = 1,2,...,12),使得总盈利达到最大可能值且满足任意consecutive 5 months的总盈利为负,由于s和d都是固定的

且必满足 s >= 4 * d, s < 4 * d && 2*s>3 *d,s < 1.5 * d && 3 * s >= 2 * d,3 * s < 2 * d && 4 * s >= d, 4 * s < d这几种情况之一

且由于上述是最优解,所以a1...a5的亏损值尽可能小,

以s<4*d&&2*s >3*d为例,则a1...a5中有一个s和4个d(若为5个d,那么将a1换为s仍符合题意且解更优; 同样的,若为2个s和3个d,那么与题意矛盾)

假设a1不是s而是d,那么s必在a2...a5中的某一个,互换s和d的位置,那么解不会变差,

所以a1..a5的最优解是sdddd,接着6-10也是从6开始往后考虑的开始

(其实任意性保证了最优子结构的合理性)

然后a11,a12则应选择一个s一个d(否则a7-a15总盈利为正)

 

what's special:

关于题意的理解:认为0是盈利...

(反正就两种理解,尝试一下也无妨)


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值