阿里巴巴2013笔试最后一题解答
2013-05-10 23:33
281 查看
题目描述:一个淘宝金冠卖家有n个仓库,每个仓库存储量不同,他想通过搬运使得所有仓库存储量相等,n个仓库形成环状,搬运只在相邻仓库间发生,请设计高效算法达到卖家的目的,并且使得总搬运量最低。
分析:设每个仓库库存为a[i],第i个仓库搬给其右边的仓库x[i]个。m为最后每个仓库库存。可有方程
m = a1 - x1 + x2
= a2 - x2 + x3
=﹉
= an - xn + x1
x2 = m - a1 + x1 = x1 - c1
x3 = m - a2 + x2 = x1 - c1 + m - a2 = x1 - c2
x4 = x1 - c4
…
xn = x1 - cn
问题为求出x数组使得所有元素之和最小,只要求出x1即可。ci为已知,所以问题可转化为数轴上n个点ci,求出一点使得其到各个点的距离之和最短。可以证明所有点的中间点即为最解。简单证明如下:
设最解点为k,如果k不是最中间点,则必然其两边有的点数不同,不妨设右边点数多于左边,为了更具体,不妨设左边有2个点,右边有3个点,现在使k向右移动d个单位,则左边所有点到k的总距离将增加2d个单位,而右边减少3d个单位,总距离减少d个单位,显然k不是最优解,当k右移至中间点时,此时无论左移或右移都会增加总距离,故中间点为最优解。
以上证明并不严谨,但足以说明最优解。
程序如下
时间复杂度o(nlogn).,若有朋友发现错误,欢迎指正,共同学习。
分析:设每个仓库库存为a[i],第i个仓库搬给其右边的仓库x[i]个。m为最后每个仓库库存。可有方程
m = a1 - x1 + x2
= a2 - x2 + x3
=﹉
= an - xn + x1
x2 = m - a1 + x1 = x1 - c1
x3 = m - a2 + x2 = x1 - c1 + m - a2 = x1 - c2
x4 = x1 - c4
…
xn = x1 - cn
问题为求出x数组使得所有元素之和最小,只要求出x1即可。ci为已知,所以问题可转化为数轴上n个点ci,求出一点使得其到各个点的距离之和最短。可以证明所有点的中间点即为最解。简单证明如下:
设最解点为k,如果k不是最中间点,则必然其两边有的点数不同,不妨设右边点数多于左边,为了更具体,不妨设左边有2个点,右边有3个点,现在使k向右移动d个单位,则左边所有点到k的总距离将增加2d个单位,而右边减少3d个单位,总距离减少d个单位,显然k不是最优解,当k右移至中间点时,此时无论左移或右移都会增加总距离,故中间点为最优解。
以上证明并不严谨,但足以说明最优解。
程序如下
int foo(int a[]){ for(i : 0——n) sum += ai; m= sum / n; c0=a1 - m; for(i:1——n) ci = c[i-1] + ai - m; sort(c, c+n); x0 = c[n/2]; sum = x0; for(i:1——n){ xi = x0 - ci; sum += xi; } return sum; }
时间复杂度o(nlogn).,若有朋友发现错误,欢迎指正,共同学习。
相关文章推荐
- 2013阿里巴巴校园招聘笔试(大题,无解答)
- 2013阿里巴巴实习笔试题 最后两题 明星问题+仓库运货
- 阿里巴巴2013笔试题 最后大题的分析(网络资料整理)
- 阿里巴巴2014校园招聘笔试最后一道题目
- 2013年阿里巴巴实习生招聘笔试题目及解答
- 阿里巴巴2013实习生笔试题精选2道算法题
- 2013阿里巴巴软件测试笔试题
- [置顶] 2017.9.9网易校招笔试最后一道编程解答
- 阿里巴巴2014校园招聘笔试最后一道题目
- 2013阿里巴巴暑期实习生笔试题目
- 阿里巴巴2013实习生笔试题精选2道算法题
- 阿里巴巴2013实习生招聘笔试题
- [笔试题] 阿里巴巴2013技术类笔试题(完整版手工记录+详细解析)
- [笔试题] 阿里巴巴2013技术类笔试题(完整版手工记录+详细解析)
- 2013九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试题
- 阿里巴巴2013笔试
- 2013阿里巴巴安全工程师实习生招聘笔试小结
- 阿里巴巴2013笔试题
- 阿里巴巴2013实习生笔试题精选2道算法题
- 2013阿里巴巴实习生笔试