http://acm.hdu.edu.cn/showproblem.php?pid=5303

说一下题目大意。。

有一个长为L的环。。你家在原点位置0,那么剩下L-1个点上种有一些树,

给你树的位置和每颗树上有多少颗苹果。。然后你有一个大小为k的篮子

摘完苹果拿回家去。。然后再拿。。问你总路程最小是多少。。

上面是一个额外的限制。。但是我没把他当回事

读题有一个trick..那就是我看到了x[i]可以等于L

然后如果说原点是0.。那么长度为L的环。。还剩下1~L-1可以编号。。哪里来的L号呢。。

如果你强行放一个L号的进来。。那环的长度就变成了L+1不符合题意

但是我们怎么理解呢。。在环长度不变的情况下。。顺时针编号。。那么L号与0号重合。。我们只能这么理解了。。

这是读题的一点trick

把环切成两半,把树按距离排序

应该有两种策略。。第一从小的往大了取。。具体来说先取完小的。。取完小的篮子还有剩余怎么办,现在还不知道

第二从大往小了取。。具体来说。。先取完最大的。。然后再取次大的。。,但是有坑。。

我的第一个疑问是如果一趟搬运采用策略1直到单侧装满篮子(能装满的话),和策略2哪个更好。。

假如1位置是a,2位置是b

k>a,b>a,那么a取完之后篮子还有剩余要不要去把b的取了呢

如果取的话,总距离是

2*(2+2*floor((b-(k-a)+(k-1))/k*2))

不取的话总距离是

2*(1+floor((b+(k-1))/k*2))

(加上(k-1)是一个trick..余数不等于零那么就会给答案贡献1,[(1+(k-1))]/k=1,因为除数正好是k)

两者作个差。。但是带有floor函数的式子无法直接相减。。

因为floor(a)-floor(b)!=floor(a-b)比如说a=7.5,b=1.6,6!=floor(5.9)=5

但是带入公式我们就能发现。。k>a并且b>a时。。k越大。。好像没看出来关系。。233

但是我们发现。。有时不取B比取B更优。。

1,2 然后k=2,从前往后贪着取。。你会发现。。还不如取完第一个直接回家。。然后再取第二个(2+4)>(4+4)

我觉得原因主要在于多出来的容量没有把b全部带走

看了一下老顽童菊苣的题解明白了一些

http://taosama.github.io/2016/03/18/HDU%205303%20Delicious%20Apples%EF%BC%88%E8%B4%AA%E5%BF%83%EF%BC%89/

然后。。

貌似是这样的把苹果离散化之后,l[i]表示左侧取第i个苹果的最小代价。。将l数组排序以后

l[i]=pos[i]+l[i-k];翻译一下就是取第i个苹果的代价是第i个苹果到原点的距离加上取第i-k个苹果的代价

为什么这么搞是对的呢。。

现在窝好像终于懂了。。首先我们先分析了这个类似dp的东西递推。。前提要按从小到大排序。。

为什么要排序呢。。因为我们要从小到大贪。。至于之前的那个贪法。。确实不是固定的。。而且

先取完最小的。。再取完次小的这个策略并不是最优的。。

请注意我们如果以树为单位。。则需要去试。。每一次取多少苹果回去。。有时候空着篮子回去给后面留一个大包圆是最优的

并不是每一次取满最优。。

比如说6,2,3这个单侧的情况。。k=5,我们只是发现了顺着挨个取完最小的是2+6+6..

而直接取完小的篮子还有空余也不往前走。。直接回家的话是,2+2+6

并且。。先取后两个2,3再取6也是6+2+2=10

但是实际上正解用的是一种dp的策略。。因为它认为当前取第i个苹果的代价能够让篮子一次至少装够k是最优的。。

所以按照题目的推法6+2+3=11,l[11]=3+l[6],l[6]=1+l[1],l[1]=1+l[0],l[0]=0,l[0]是边界

所以。。实际上这个意思是说最终的方案是先l[1],再l[6],再l[11],就是第一次取一个。。第二次取k=5个取到6,第三次取k=5个到11

所以说即使从前往后面取。。全取也不一定是最优的呀。。这个一开始就没发现。。数据太难造了吧。。我擦

我们一开始就应该考察取法所造成的差别。。如果发现这是一个动态的取法的话。。就会往这方面想了。。这个东西简直玄学。。情况会变的。

也就是说增加苹果的数量对答案产生后效性。。但不改变之前的答案。。好吧说后效性不太好。。

由于我们是先算完左边再算了右边。。我们知道最后两边剩余等于k或者小于k我们可以一次绕圈解决。。

但是。。左边的剩余a,右边的剩余b,a+b<=k,有很多种情况。。那么我们枚举左边的剩下的就是右边的

因为我们离散化了。。所以这个就很好枚举了。。对应的离散情况的答案都算出来了。。

离散化真是tmd神了。。

这里的问题就是为什么我们不枚举那些小于k的的组合。。

前面已经枚举过了不绕圈的情况

后面我们要做的就是枚举一定绕一圈的情况。。事实上最优的话只能绕一圈。。详见老顽童博客。。上面的链接。。

我们观察到随着苹果数量的增多。。其代价一定是非严格单调增长

于是。。我们一定要绕一圈加上两边的剩余的苹果的代价。。那么我们一定是让两边剩余苹果越少越好。。

即让绕圈采摘的苹果越接近k越好。。即L一定l[a]+r[b]越小越好。。它越小则已经采摘的苹果数量就越少

所以我们只需要枚举k,而不需要枚举小于k的那些组合。。

对于k的所有组合。。比如说5,:1,2,3,4,*(4,3,2,1)=4种分成两半的组合

如果是3,4的话。。某个枚举可能会使3成为负数。。此时给它当成0看待

然后我们绕一圈仍然可以解决这个问题。。绕一圈一定能把这个<k的给弄走。。

然后这个题基本上做完了。。但是离散化和数据的构造都没有想到。。这是非常致命的一点

========

对于前面那个采摘满篮子的猜想。。

如果我们从后面往前贪心的话

取完1我们是往回削2呢还是往前削1呢。。

经过简单计算。。显然削1答案更小。。

对于这个我们先取了最远的1,如果往后。。+6

然后+4,+2,+6

如果我们先取1,往回走,+6,+2,再取右边的2,+6

显然比上面好。。

于是我们先取最后一个就不好判断你是往回走还是往前走了。。

而且如何能判断最优呢。。你必须全算出来才行。。才能比较大小。。

即使你这次不绕圈。。下次可能就会满足绕圈的契机了。。

但是只绕一圈好像没法证明。。

你这样的话。。真的不好算啊。。

枚举每次绕不绕。。就变成搜索了。。而且好像不太能搜啊。。

hdu5303贪心的更多相关文章

  1. 2015 多校联赛 ——HDU5303(贪心)

    Delicious Apples Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  2. hdu5303(2015多校2)--Delicious Apples(贪心+枚举)

    Delicious Apples Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  3. Hdu5303 Delicious Apples 贪心

    题目链接: HDU5303 题意: 有一条环形的长为L的路,仓库在位置0处, 这条路上有n棵苹果树,给出每棵苹果树的位置和苹果数量, 问用 一次最多能装K个苹果的篮子   把这条路上全部苹果採回仓库最 ...

  4. [2015hdu多校联赛补题]hdu5303 Delicious Apples

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5303 题意:在一个长为L的环形路径上种着一些苹果树,告诉你苹果树的位置(题目中以0~L指示坐标)及苹果 ...

  5. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  6. HDOJ 1051. Wooden Sticks 贪心 结构体排序

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]

    1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 786  Solved: 391[Submit][S ...

  9. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

随机推荐

  1. Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件

    1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...

  2. gRPC-go源码(1):连接管理

    1 写在前面 在这个系列的文章中,我们将会从源码的层面学习和理解gRPC. 整个系列的文章的计划大概是这样的:我们会先从客户端开始,沿着调用路径逐步分析到服务端,以模块为粒度进行学习,考虑这个模块是为 ...

  3. Django Signals

    信号 Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. Django内置的信号 Model si ...

  4. Java 给Word不同页面设置不同背景

    Word文档中,可直接通过[设计]-[页面颜色]页面颜色,通过Java代码可参考如下设置方法: 1. 设置单一颜色背景 doc.getBackground().setType(BackgroundTy ...

  5. kvm虚拟机管理(创建、连接)

    创建虚机.远程管理kvm虚机.virsh命令行下管理虚机..kvm通过virsh console 连入虚拟机   一.创建虚机 1)打开虚拟化管理器

  6. Maven 知识点总结以及解决jar报冲突的几种方法

    1.常见的命令 Compile Test Package Install Deploy Clean 2.坐标的书写规范 groupId 公司或组织域名的倒序 artifactId 项目名或模块名 ve ...

  7. 一个关于ExecutorService shutdownNow时很奇怪的现象

    我们知道很多类库中的阻塞方法在抛出InterruptedException后会清除线程的中断状态(例如 sleep. 阻塞队列的take),但是今天却发现了一个特别奇怪的现象,先给出代码: publi ...

  8. how2j 仿天猫j2EE零散笔记

    1. 在servlet中拼接  :"http://localhost:8080/tmall/admin_property_list?cid=83"  这句话中的cid=83时, c ...

  9. CSS中一些重要概念

    在CSS的最后一个博客中,将学习整理一些CSS中的重要概念,对这些重要概念的掌握,将对CSS的认识十分重要. 了解这些概念对深入理解CSS的本质十分重要:(1)包含块containing block ...

  10. SSH框架搭建详细步骤整理

    学习Java面前有两座山,一座山叫SSM,一座山叫SSH,跨越了这两座山之后才能感受到这个语言的魅力所在,SSM框架的搭建详细在之前博客已经涉及了,今天来整理SSH框架详细步骤: 生有涯 而 学无涯 ...