POJ 2586 Y2K Accounting Bug(贪心+枚举)

原创 2017年04月07日 14:28:49

原题地址

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

题意:已知每个月的经营状况要么盈利s,要么亏损d,若每五个月的汇总都是亏损,求这一年12个月最大盈利额(不能盈利则输出Deficit)。

解题思路

这道题被划分到贪心的题库里,但是其实不用花时间在贪心算法的设计上。

最直观的贪心思路就是,为了使每5个月亏损且总和盈利,那就要利用相邻的5个月的重叠部分,将亏损的月份放在这些部分且使每5个月的亏损值最小。即:让亏损的月份在尽量往后排,向右辐射。

以测试样例为例,每个月要么盈利59,要么亏损237,根据上面的贪心思想,做出一下安排:
1. 先处理1-5月,不难发现,在前4个月盈利后1个月亏损的安排下,保证了5个月经营之和为负,且亏损额尽可能少。因此,每5个月4s1d是这次例子的贪心模式。
2. 再处理之后的与安排亏损的5月份有交集的每5个月,对于2-6月由于5月份已经安排过d,所以6月份继续排s,3-7月、4-8月、5-9月以此类推…
3. 再处理6-10月时重复1-5月的安排,剩余的月份参照步骤2的安排。
4. 统计盈利月份数=10,亏损月份数=2,全年经营之和即10*59-2*237=+116

由于这道题比较简单,我们可以手动模拟推出每5个月在不同s、d组合下,找到使全年盈利额最大的贪心模式、全年盈利及亏损月份数

  • SSSSDSSSSDSS(4s 1d,总计10s 2d)
  • SSSDDSSSDDSS(3s 2d,总计8s 4d)
  • SSDDDSSDDDSS(2s 3d,总计6s 6d)
  • SDDDDSDDDDSD(1s 4d,总计3s 9d)
  • DDDDDDDDDDDD(0s 5d,总计0s 12d)

AC代码

#include <iostream>

using namespace std;

int main()
{
    int s, d, dSeason, sum; //dSeason指每五个月亏损最少需要几个d
    int dYear[] = {2, 4, 6, 9, 12}; //每五个月里需要的d造成的年亏损月份数
    while (cin >> s >> d)
    {
        dSeason = 1; //至少亏损一个月
        while ((5-dSeason)*s - dSeason*d > 0) ++dSeason;
        sum = (12-dYear[dSeason-1])*s - dYear[dSeason-1]*d; //年净收入
        if (sum < 0) cout << "Deficit" << endl;
        else cout << sum << endl;
    }
    return 0;
}

内存占用:224K 耗时:32ms
算法复杂度:O(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。

poj 2586 Y2K Accounting Bug——我感觉是枚举(分类是贪心)

Y2K Accounting Bug Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9776...
  • u013014691
  • u013014691
  • 2014年06月13日 19:11
  • 331

poj 2586 Y2K Accounting Bug【贪心】【刷题计划】

Y2K Accounting Bug Time Limit: 1000MS   Memory Limit: 65536K Total Submissio...
  • hello_sheep
  • hello_sheep
  • 2017年11月16日 17:08
  • 288

Y2K Accounting Bug(简单枚举)

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22007#problem/E E - Y2K Accounting Bug Tim...
  • JHC23
  • JHC23
  • 2013年04月17日 20:00
  • 698

Y2K Accounting Bug(二进制+枚举)

E - Y2K Accounting Bug Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I6...
  • zsc2014030403015
  • zsc2014030403015
  • 2015年10月01日 13:08
  • 412

隐藏的BUG探讨——从“Y2K”问题到“2038”年问题

前几天在饱览书籍的过程中,饶有兴致的注意到一个在历史上曾经叱咤过全球的严重计算机BUG,于是记录下来,等待以后入坑什么是千年虫(Y2K)问题千年虫-百度百科 计算机2000年问题,又叫做“千年虫”...
  • Mikeoperfect
  • Mikeoperfect
  • 2017年06月18日 15:22
  • 488

POJ 2586 水贪心。

Y2K Accounting Bug Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9260   Accepte...
  • u011481752
  • u011481752
  • 2014年01月23日 15:48
  • 617

(省赛训练系列)贪心的说 poj贪心经典题目

Crossing River Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Subm...
  • u012349696
  • u012349696
  • 2015年04月05日 21:04
  • 1319

poj_1753 递归+枚举

思路是别人的,自己理解了半天,渣渣
  • yeruby
  • yeruby
  • 2014年04月08日 20:48
  • 1574

POJ1328 -- 贪心算法和快速排序

一 。贪心策略:将雷达放置在合适的地方,使得包含的岛屿数量最多。 二。具体分析 我们采用从左到右放置雷达。假设左边第一个岛屿是A(Xa,Ya),从左到右的岛屿依次是A B C .... 我们可以计算出...
  • Genius9_9
  • Genius9_9
  • 2015年06月02日 15:31
  • 686

五大基础算法(枚举、递归、分治、贪心、模拟)

一、枚举法 枚举法,本质上就是搜索算法。 基本思想: 枚举也称作穷举,指的是从问题所有可能的解的集合中一一枚举各元素。 用题目中给定的检验条件判定哪些是无用的,哪些是有用的。能使命题成立。即为其解。...
  • Linoi
  • Linoi
  • 2013年12月18日 13:09
  • 5779
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2586 Y2K Accounting Bug(贪心+枚举)
举报原因:
原因补充:

(最多只允许输入30个字)