zoukankan      html  css  js  c++  java
  • poj2586 Y2K Accounting Bug —— 枚举

    链接:http://poj.org/problem?id=2586


    题意:大意是一个公司在12个月中,或固定盈余s,或固定亏损d.但记不得哪些月盈余,哪些月亏损,只能记得连续5个月的代数和总是亏损(和<0算亏损),问全年是否可能盈利?若可能,输出可能最大盈利金额,否则输出“Deficit".


    题解:看了网上的题解,基本上都说是贪心,但我不知道怎样贪心,只不过按自己的想法去做(做的时候不够细心,忽略了细枝末节)。由于连续5个月必须亏损,所以就但看5个月内,亏损最少的情况,是1*d与4*s,是2*d与3*s……5*d+0*s(忽略点1,如果4个月的亏损都小于1个月的盈利,根据题意,那只能5个月都亏损了)。 即要算出单独在5个月内,在亏损最少的情况下,亏损与盈利所占的比例。假设算出d的月份数为k,即用最少的d,去填这12个月,使得每连续5个月,都至少有k个月份为d。由于越靠中间的月份出现的次数越多(但5,6,7,8均出现5次),所以我决定分别在5与8月份开始放置k(为何选5和8,因为他们靠中间,贡献大,且又能照顾到最尾端的月份,且中间的6,7月离得很近,也照顾得到),并且随着k的增大依次向两边放置,如k = 2时,放2,4,8,9。由于没有继续推下去,初以为就直接是2*k个月为亏损。但却忽略了k=4或5时,当k=4时,每向两边放4个,两边都可满足,但是在中间的6,7月份,却有连续两个s盈利,就不符合k=4的条件,所以要在6,7月中再放一个d,即总共为9个d,当k=5时,就直接是12个月了。

    所以,这种方法是枚举,不过枚举量少,可以人工枚举。(方法笨拙,见谅!)


    收获:当枚举量小时,可人工枚举,但是要注意细节。且当得出一个结论时,不要理所当然以为对,要从多个角度,特别是边界条件,去考验这个结论是否站得住脚。


    代码如下:


    #include<stdio.h>
    
    int main()
    {
        long long r,s,d,sum;
        while(scanf("%lld%lld",&s,&d)!=EOF)
        {
            if(d*1>s*4) sum = 10*s - 2*d;
            else if(d*2>s*3) sum = 8*s - 4*d;
            else if(d*3>s*2) sum = 6*s - 6*d;
            else if(d*4>s*1) sum = 3*s - 9*d;
            else sum = -1;
            if(sum>0)
                printf("%lld
    ",sum);
            else
                printf("Deficit
    ");
        }
        return 0;
    }


  • 相关阅读:
    【HDOJ】2774 Shuffle
    【POJ】2170 Lattice Animals
    【POJ】1084 Square Destroyer
    【POJ】3523 The Morning after Halloween
    【POJ】3134 Power Calculus
    【Latex】如何在Latex中插入伪代码 —— clrscode3e
    【HDOJ】4801 Pocket Cube 的几种解法和优化
    【HDOJ】4080 Stammering Aliens
    【HDOJ】1800 Flying to the Mars
    SQL语法
  • 原文地址:https://www.cnblogs.com/DOLFAMINGO/p/7538785.html
Copyright © 2011-2022 走看看