之前参加了阿里的笔试和电面,让后天那个敏感的日子去参加现场面,就去看了一下那天笔试的最后一道综合题,看着网上清一色最后一道题不知道从哪转的答案,不忍直视,一看代码就是错的,最直接的就是求中位数连奇偶性都不判断,直接处以2..这,另外当在无法整除的情况下,数据结果错误。无法处理小数

这道题的大意是:有一个淘宝商户,在某城市有n个仓库,每个仓库的储货量不同,现在要通过货物运输,将每次仓库的储货量变成一致的,n个仓库之间的运输线路围城一个圈,即1->2->3->4->...->n->1->...,货物只能通过连接的仓库运输,设计最小的运送成本(运货量*路程)达到淘宝商户的要求,并写出代码。

解题思路:

假设n个仓库的初始储货量分别为warehouse[1],warehouse[2],...,warehouse[n]
计算平均储货量

average = (warehouse[1]+warehouse[2]+...+warehouse[n])/n

就算出来了最终的结果中,每个仓库应该有的存量
首先,从仓库1向仓库n运送k;
然后,从1到n-1,依次向下运送某一特定值,使得每一个仓库的余量都为average,剩下的问题就是求总代价的最小值了。

设第0步从1仓库向n仓库(注意因为是圆圈,所以路径长度是1)运出k存量,k可以为负,如果为负数,意味着从n向1运输|k|存量,然后从循环,从(1到n-1),从i仓库向i+1仓库运输,运输的量需要保证i仓库在运输完毕后等于average

  1. 第0步(从仓库1向仓库n运送k):花费代价为 |k|,
  2. 第1步(确保仓库1的余量为average):需要花费代价为
    |warehouse[1]-average-k|

    也就是从1向2伙从2向1运输

  3. 第2步(确保仓库2的余量为average):代价为
    |warehouse[2]+warehouse[1]-average-k-average|=|warehouse[1]+warehouse[2]-2*average-k|

...
n-1.第n-1步:代价为

|warehouse[1]+warehouse[2]+...+warehouse[n-1]-(n-1)*average-k|

此时,仓库n剩下的货物量:

(warehouse[n]+k)+warehouse[1]+warehouse[2]+...+warehouse[n-1]-(n-1)*average-k=(warehouse[1]+warehouse[2]+...+warehouse[n])-(n-1)*average=average

刚好也满足,其实这里不用推导,因为平均值是算好的,所以最胡一定是刚好完成的。

总的代价为

|k|+|warehouse[1]-average-k|+|warehouse[1]+a[2]-2*average-k|+...+|warehouse[1]+warehouse[2]+...+warehouse[n-1]-(n-1)*average-k|

不妨令

sum[i] = warehouse[1]+warehouse[2]+...+warehouse[i]-i*average

则,总代价可表示为:

|k|+|sum[1]-k|+|sum[2]-k|+...+|sum[n-1]-k|

这个式子可以看成在水平数轴上寻找一个点k,使得点k到点0,sum[1],sum[2],sum[3],...,sum[n-1]的距离之和最小,显然k应该取这n个数的中位数。至此问题解决。

给出详细注释代码:

#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include<string>using namespace std;const int X = 100000;
double sum[X],warehouse[X];
int n;double Abs(double x)
{return max(x,-x);
}int _tmain(int argc, _TCHAR* argv[])
{while(true){double total = 0;double mid=0;cout<<"请输入仓库数目:";cin>>n;//读入n个仓库的值,并计算总数for(int i=1;i<=n;i++){cout<<"请输入第"<<i<<"个仓库的存量:";cin>>warehouse[i];total += warehouse[i];}//计算每个仓库应该最终存储的值double average = total/n;//计算sum数组for(int i=1;i<n;i++)sum[i] = warehouse[i]+sum[i-1]-average;//排序后打算去中位数//sort采用半开半闭区间,所以排序为0~n-1sort(sum,sum+n);//这个可以自己举个数字就知道了if(n%2!=0){    mid = sum[n/2];}else{mid=(sum[n/2]+sum[n/2-1])/2;}cout<<"应该从1开始,运输"<<mid<<"货物,然后依次保证符合条件即可"<<endl;double ans = Abs(mid);for(int i=1;i<n;i++)ans += Abs(sum[i]-mid);cout<<"总成本花费是:"<<ans<<endl;cout<<"----------------------------------------------------------------------"<<endl;}return 0;
}

思路借鉴了:http://hi.baidu.com/hujunjiehit/item/54204f01931ee6c49157184c

错误之处欢迎留言指出..

我的博客:http://leaver.me/archives/3026.html

转载于:https://www.cnblogs.com/lazycoding/archive/2013/06/02/3113989.html

阿里巴巴5月5日综合算法题详解相关推荐

  1. 这就是那个著名的接雨水算法题详解

    接雨水 今天给大家带来的是一道特别特别特别经典的题目接雨水问题,这个问题是很多算法书上面举例过的题目.虽然是难度题,但是相对来说还是比较容易理解的,代码长度也适中,说了这么多,就一个意思,大家记得打卡 ...

  2. 2019年电赛综合测评题详解

    2019年全国大学生电子设计竞赛综合测评已经结束,邀请到西电研究生李天红同学给大家做重点分析. 首先看题目: 视频要点提示:题目分析.常用波形变换电路.两种可行方案.方案仿真.实际过程中遇到的问题分析 ...

  3. 王者服务器维护结束2020331,S19荣耀进阶战令的星元部件是哪一位英雄的 王者荣耀2020年3月31日每日一题答案 - 找游戏手游网...

    版本:v1.52.1.37 类型:MOBA跑酷大小:1.98 GB评分:9.2 标签: moba 腾讯游戏 塔防 竞技游戏 角色扮演 联机对战 立即下载 S19荣耀进阶战令的星元部件是哪一位英雄的?这 ...

  4. leetcode.cn 2022年11月4日 打卡题 754. 到达终点数字【一元二次方程解法,时间复杂度O(1)】

    leetcode 2022年11月4日 打卡题 754. 到达终点数字 写在前面   首先感谢 @子不语 大佬发布的一元二次方程代码实现的启发.题解链接:子不语-754. 到达终点数字   本文侧重梳 ...

  5. 怎么往integer型数组添加数据_用户日活月活怎么统计 - Redis HyperLogLog 详解

    HyperLogLog 是一种概率数据结构,用来估算数据的基数.数据集可以是网站访客的 IP 地址,E-mail 邮箱或者用户 ID. 基数就是指一个集合中不同值的数目,比如 a, b, c, d 的 ...

  6. 让理科生沉默,让文科生流泪的综合题详解

    让理科生沉默,让文科生流泪的综合题详解 阿布evo 发表于  2011-05-09 21:34 原文地址:http://www.guokr.com/article/31315/ 这套题就是前两天在校内 ...

  7. 研究生专业课计算机科学基础,计算机学科专业基础综合科目408综合教程及历年真题详解(最新版全国硕士研究生招生考试计算机科学与技术学科联考)...

    导语 内容提要 开点工作室编著的<计算机学科专业基础综合科目<408>综合教程及历年真题详解(最新版)>作为全国硕士研究生招生考试中计算机科学与技术专业的计算机专业基础综合科目 ...

  8. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  9. 十日均线算法oracle,10日均线法的详解

    @@@.各位..注意该股必需是多头排列.....最好是多头市场.........这样正确率才高..收盘价在十天平均线上才可以考虑买入股票.股价跌破十天平均线时,必须卖出股票.有的人一定会觉得这太简单. ...

最新文章

  1. 那些消失的互联网中年人
  2. SAP配置webdynpro完全手册 .
  3. python list去重_Python中实用却不常见的小技巧
  4. 肝!十大 Python 机器学习库
  5. Python编程快速上手-字典
  6. Google Map浏览下载器
  7. 巧用Java8中的Stream,让集合操作6到飞起!!!
  8. Ajax的简单使用方法
  9. qml入门学习(七):单独文件自定义组件
  10. 非索引列上的统计 第二篇
  11. 【MFC相关问题】vs 2019 出现 building MFC application with /MD [d] (CRT dll version) requires MFC shared
  12. Ubuntu系统---C++之Eclipse IDE 编译器安装
  13. 【python|opencv】读取/保存图片,路径含有中文问题解放方案(opencv 无法读取/保存图片)
  14. 用科比一生的数据,回顾他的球场传奇
  15. Ubuntu20.04 安装matlab2017b
  16. 简要介绍弱监督学习(by 周志华)
  17. chrome下载文件竟然都有缓存!
  18. foxmail代理设置方法
  19. 2022年乡村医生考试精选复习题及答案
  20. 蒙特卡罗模拟赌徒人生

热门文章

  1. Google AI 研发医疗新模型,预测死亡率比医院高出10%
  2. 上万家物联网公司会被“政策死”吗
  3. 源码资本张宏江:只有算法和技术,那你一定挣不到钱
  4. 程序员内卷的结局 | 每日趣闻
  5. 夏天写代码真难!16G 内存根本不够用! | 每日趣闻
  6. 玩转Parse(第一篇:新手入门)
  7. vue开发知识点总结
  8. jquery检验身份证规则
  9. 曝iOS存在缺陷 黑客可强制iPhone拨打收费电话
  10. 在Linux的Eclipse下搭建Android环境