• BZOJ1113 海报PLA1(单调栈入门题)


    一,自己思考下

    1,先自己思考下

    N个矩形,排成一排,现在希望用尽量少的海报去cover住它们。

    2,不懂。

    着实不懂。

    3,分析下,最优性问题对吧,然后就每什么想法了。。

    虽然肯定和单调栈和单调队列有啥关系来着。

    二,听课

    1,由图观察得知,至少有一栋楼是被完全覆盖的

    2,覆盖的楼不整齐的话必然不优,这人费曼肯定没学,好!!

    3,f[i]表示将第i栋楼完全覆盖,并以该房屋的高度将广告向左延申的最大距离

    为啥向左,就是我们来的方向呢》因为左右对称??

    4,什么倒着左边右边也一样?

    从左往右一遍,

    从右往左一遍,

    两边加起来,就是可以延申的最大距离?》

    5,f数组时干啥的

    6,什么时候 会学习一个东西不容易懂?我们该如何让东西变得容易学?

    那么为什么要容易学?不容易学 你就学不下去,你就颓了。。。

    所以我现在再干什么?我在学算法。我在学编程,程序题。

    是抽象的,但是,什么是抽象?什么是具体?

    为什么大家说抽象的不容易学习?先回答什么是抽象的吧?

    额,先回答什么是具体吧,具体也许就是。。你能看的见的意思。

    抽象,,那就是看不见的东西喽。

    这是我从百度上荡得,抽象是指从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃的思维过程。 [1] 

    caonima,别吹np了,

    赶紧怎么想想怎么能快乐得写完这题。

    怎么能快乐地学习代码???

    我来总结下代码学习,都基本靠题目,然后都基本靠代码,然后都基本靠些enough或者not enough的垃圾注释。

    所以你的总结是?不管学啥,想要轻松,你就提前先预习,

    所以对于海报这个题,我觉得先预习

    你需要一本教材来带领你。

    7,关于这道题的思路。

    或者好多题的思路,总归是一个优化题。

    题目如下:

    现在希望用尽量少的矩形海报Cover住它们;

    你要学会转化题意,不就是问你最小的海报数么?

    最小的海报数你肯定不知道呗,但是转化下最大的海报数你知道嘛?

    我知道。。n个建筑物肯定n个啊.(这里就不要杠了。。我估计有不少人会挂在这里)

    然后其实就转化成一个优化问题了。而优化问题,说白了不就是让你找个破规律啥的呗。

    嗯所以别人给我的臭规律是

    8,所以在这里我们可以总计一下做题的技巧。

    ①先看题,你要学会转化题意,抽象出题意来。或者转化成你能理解的问答方式。

    9,

    嗯嗯,我咋还是不懂?

    来,我来正常地认真看一遍这东西。

    这个时候再听至少有一个楼被覆盖就容易懂了?(感觉核心是之前不专注而导致效率不高把?)

    再往下看就直接懂了,所以说预习是很重要的。(其实 是变相地增加学习时间)

    至于左右,反正你右边肯定不行,因为都是未知的啊。

    对噢,左右做又懂了,所以关键是之前不 专注啊。。

    两边加起来确实就是你可以向两边延申的距离。

    其实这题还有些限定,就是之前说的应该说成每栋楼是被完全覆盖的才是最优的。

    同时我好像懂了为什么。

    别扯这么多,show me the code.

    我感觉这题这思想再入门哪里见过。

    为什么要维护栈内单调性呢?

    10,还不如从高度差讲起。

    在我限定各栋楼被单独覆盖住才算最优的话,

    x个高度差,x个海报。

    一旦有相同的,就可以减了。

    那么我们直接存所有的,看有多少个高度差相同的不就完了。

    额。。果然有些人和我思想一样,但是这个数据范围。。。呵呵

    11,有个人题解我觉得挺好的额

    偷一下它的结论,

    这是一道单调栈的经典入门例题.

    所谓单调栈,就是维护一个单调递增或递减的栈(可以是严格递增递减,也可以不严格).

    对于这道题,我们可以很轻易的发现可能答案的最大值是n,即建筑数量.然后进行了一波瞎几把猜测观察,我们又可以发现好像出现了高度相等的建筑,那么答案就要减一.(建筑宽度一斤已经被我们踢到了一边)

    啊!水题!这也配得上绿题看我秒切!

    然后你绞尽了脑汁你也想不出来怎么用简单的做法把这个 1≤di,wi≤1 000 000 000给搞定

    最后你在错误的道路上越走越远......

    时光倒流到你刚看到这道题的时间点.你的思路一开始走偏了,但是突然瞥见题目难度之后的一抹绿色,你眉头微皱,嘴中喃喃细语.

    (跳过以下的一万字)

    单调栈听上去似乎有一些抽象,那么我们从一些样例入手.(输入的都是高度,宽度已经被踹到了一旁瑟瑟发抖)

    输入 1 2 3 2 1 输出 3

    输入 2 3 1 3 1 输出 4

    输入 4 5 2 5 4 输出 5

    困惑.明明每组数据都是有两对相等的,为什么输出结果不同?

    容易观察得出,样例1中的一对相等数1,1,他们中间的所有数都不比他们小,另一对2,2,中间的数也不比他们小;对于样例2,相等数对3,3,中间的1比他们小,而1,1,中间的3比他们大;对于样例3,数对4,4,中间有一个2比他们小,5,5同理。

    据此我们可以瞎几把猜想推断出,每有一对相等数,他们中间所有数都比他们大,那么就可以少用一张海报.可是怎么实现呢

    这时候自然要请出我们的单调栈了。该题维护的是一个单调不递减的栈(因为如果有一个不单调不递减就不能满足我们推断出的结论)。

    12,

    大家的代码基本都差不多。

    给自己点空想时间。

  • 相关阅读:
    SimpleITK学习(二)图像读取
    SimpleITK学习(一)基本概念
    pydicom读取dicom文件报错
    【Python】模拟登录上海西南某高校校园网 (jaccount)
    Leetcode 5
    【C++】枚举类型及其用法
    Leetcode 617 合并二叉树
    【端口转发】如何在外面访问家里的内网计算机?
    Python字典列表字段重组形成新的字典
    Android使用JDBC连接数据库
  • 原文地址:https://www.cnblogs.com/beiyueya/p/12035105.html
Copyright © 2020-2023  润新知