码迷,mamicode.com
首页 > 移动开发 > 详细

2015多校第二场 1004( Delicious Apples )

时间:2015-07-23 21:52:01      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

题意:有一条圆形的路,你的仓库在0点,这条路长l,然后有n个苹果树,每个数的坐标是xi(顺时针),每棵树上有ai个苹果。你有个篮子,能装k个苹果,问你用这个篮子将所有苹果装回仓库所走的最短路为多少?

1n,k105,ai1,a1+a2+...+an105
1L109
0x[i]L
请特别注意上面的苹果个数的条件。因为我的学长 就是从这个条件成功做出了这道题,orz!

因为苹果数不超过10^5,所以将每个苹果当作点。

用一个数组pos记录每个苹果距0点的距离,排序后,然后就可以用另外一个数组rpos记录每个苹果逆时针距0点的距离。

然后我们用两个数组来分别记录从顺时针摘取前i个苹果(这个前i个是顺时针查)所走的最短,和从逆时针摘取前i个苹果(逆时针查)所走的最短。

那么我们就可以枚举顺时针摘了多少个苹果,剩下就让它逆时针摘,两者加起来,找最小的。由于是学长做出来的,代码就不贴了,就放个核心代码吧。

        for(i=1;i<ca;i++)//ca是总苹果树
        {
            dps[i]=dps[max(i-k,0)]+min(lr,2*pos[i]);//如果原路返回比较长那么还不如直接走一圈
        }
        for(i=1;i<ca;i++)
        {
            dpr[i]=dpr[max(i-k,0)]+min(lr,2*rpos[i]);
        }

另外值得注意的是这里应用了一个贪心的策略,如果你要摘取前i个苹果,如果它比k大,那么肯定是这样去摘,先摘i-k个放回去,那后在摘剩下的。为什么不先摘k个,再摘i-k个呢,自己画下图就知道了。

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/hitwhacmer1

2015多校第二场 1004( Delicious Apples )

标签:

原文地址:http://blog.csdn.net/hitwhacmer1/article/details/47028175

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!