先来看看题目:

小易将n个棋子摆放在一张无限大的棋盘上。第i个棋子放在第x[i]行y[i]列。同一个格子允许放置多个棋子。每一次操作小易可以把一个棋子拿起并将其移动到原格子的上、下、左、右的任意一个格子中。小易想知道要让棋盘上出现有一个格子中至少有i(1 ≤ i ≤ n)个棋子所需要的最少操作次数.

输入描述:
输入包括三行,第一行一个整数n(1 ≤ n ≤ 50),表示棋子的个数
第二行为n个棋子的横坐标x[i](1 ≤ x[i] ≤ 10^9)
第三行为n个棋子的纵坐标y[i](1 ≤ y[i] ≤ 10^9)
输出描述:
输出n个整数,第i个表示棋盘上有一个格子至少有i个棋子所需要的操作数,以空格分割。行末无空格如样例所示:
对于1个棋子: 不需要操作
对于2个棋子: 将前两个棋子放在(1, 1)中
对于3个棋子: 将前三个棋子放在(2, 1)中
对于4个棋子: 将所有棋子都放在(3, 1)中
示例1

输入

4
1 2 4 9
1 1 1 1

输出

0 1 3 10

正常的思路:

# encoding=utf-8
def ManhattanDistance(x1, y1, x2, y2):return abs(x1-x2) + abs(y1-y2)if __name__ == '__main__':#读取输入数据
    n = int(raw_input())x = [int(i.strip()) for i in raw_input().split(" ")]y = [int(i.strip()) for i in raw_input().split(" ")]#初始化
    ans = [10*10] * n#问题可以转化为将棋子放在棋盘上每个格子中,计算最少的格子的操作数
    #由于可以证明结果的格子一定处于最左上棋子和最右下棋子构成的区域顾只需考虑这部分的格子即可
    for i in range(n):for j in range(n):temp = []s = 0
            #利用x[i][j]到其他点的距离更新整个最短路段径信息
            for k in range(n):temp.append(ManhattanDistance(x[i], y[j], x[k], y[k]))temp.sort()#计算将i个棋子放到x[i][j]上所需的最少操作数,并利用该信息跟新ans结果list
            for k in range(n):s += temp[k]#如果把k个棋子放到x[i][j]的操作数更少则替换原来将k个棋子放到上一个格子所需的操作数。
                ans[k] = min(ans[k], s)#输出结果
    result = " ".join([str(i) for i in ans])print result
这里需要把可行域限定在最左上棋子和最右下棋子构成的区域是比较关键的。一下引用一位网友的证明过程。
链接:https://www.nowcoder.com/questionTerminal/27f3672f17f94a289f3de86b69f8a25b
来源:牛客网

xy轴其实是独立的,先只考虑x坐标,采用反证法,假设把k个棋子堆到x0(x0不为任意一个棋子坐标)格子所用的步骤最少。
a个棋子初始在x0的左边,b个棋子初始在x0的右边.左边到x0的总距离为A,右边到x0的总距离为B.

  1. 如果a>b,那么对于最靠近x0左边的棋子坐标x[a]来说(假设x[a]与x0的距离为da,那么以x[a]坐标为基准现在的总距离为[(A+B)-da*a+da*b]<A+B,这k个棋子到x[a]的步数会更少;

  2. 同理对于b>a的情况,那么对于最靠近x0右边的棋子坐标x[b]的目标将比x0更优,

  3. 如果a=b,x[a]、x0、x[b]的步数是一样的。
因此,最终汇聚棋子的x坐标只要在棋子初始的x个坐标中考虑

感谢牛客的网友的热烈讨论,让我更加明白此题。

啊哈,灵机一动-----记网易内推编程题堆棋子相关推荐

  1. 一堆棋子java代码编程_网易2018校招内推编程题-堆棋子-C++实现

    0 1 3 10 解法 暴力枚举所有可能的点. 如图所示,黑点为输入点.所需遍历的点为红线的交点,红圈表示. 当时自己写的是遍历了外围红线所构成的封闭矩形里面所有的点了,只有60%的AC率,原因超时. ...

  2. 2017网易内推编程题(判断单词):解答代码

    2019独角兽企业重金招聘Python工程师标准>>> 小易喜欢的单词具有以下特性: 1.单词每个字母都是大写字母 2.单词没有连续相等的字母 3.单词没有形如"xyxy& ...

  3. python 内推_网易有道2017内推编程题 洗牌(python)

    本文实例为大家分享了网易有道2017内推编程题:洗牌,供大家参考,具体内容如下 ''' [编程题] 洗牌 时间限制:1秒 空间限制:32768K 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程 ...

  4. 有道python网课怎么样-网易有道2017内推编程题 洗牌(python)

    本文实例为大家分享了网易有道2017内推编程题:洗牌,供大家参考,具体内容如下 ''' [编程题] 洗牌 时间限制:1秒 空间限制:32768K 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程 ...

  5. 网易有道2017内推编程题

    网易有道2017内推编程题 两道题,都只要找到了规律就比较好些,然后就是一些细节处理! 题目一 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2 ...

  6. 2017网易有道内推编程题

    一.[编程题] 洗牌 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到 ...

  7. 洗牌 --网易有道2017内推编程题

    题目描述 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半 ...

  8. 网易2018内推编程题——操作序列

    时间限制:2秒 空间限制:32768K 小易有一个长度为n的整数序列,a_1,...,a_n.然后考虑在一个空序列b上进行n次以下操作: 1.将a_i放入b序列的末尾 2.逆置b序列 小易需要你计算输 ...

  9. 2018年网易校招内推编程题之交错01串

    如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串.例如: "1","10101","0101010"都是交错 ...

最新文章

  1. php取得客户端信息类
  2. 计算字符串相似度算法—Levenshtein
  3. oracle-关于时间的sql
  4. mac查看端口,关闭进程
  5. JavaScriptBreak 语句 continue 语句
  6. Syncd - 开源自动化部署工具
  7. linux如何查看桌面环境变量,如何设置和查看Linux系统的环境变量
  8. xampp apache无法启动的解决方法
  9. 计算机组成原理(第3版)唐朔飞著 知识点总结 第七章 指令系统
  10. android 闹钟设置铃声,安卓手机闹钟设置音乐铃声的方法
  11. TCSVT论文结构整理
  12. error:unable to access jarfile cracker2017.jar解决方法
  13. 案例复盘:从上海首例遗弃犬只案看 如何精准研判舆情争议点
  14. 机器学习测试模型 的混淆矩阵
  15. 安装MySQL报错:[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defau
  16. 小学数学测试软件报告,2017年小学数学期末考试质量分析报告
  17. 车牌识别,移植到android系统
  18. 一个android工程师写java后台的感受
  19. 自动控制原理->根轨迹
  20. GTSAM在windows下安装,配置,简单调试

热门文章

  1. JavaWeb(用IDEA设计登录页面,完成假登录)
  2. 基于JAVA沧州雄狮足球俱乐部管理系统计算机毕业设计源码+系统+数据库+lw文档+部署
  3. php mvc 商城,基于MVC框架的小型网上商城设计
  4. Redis实战(2)-数据结构之字符串String实战之存储对象
  5. 区块链区块乱世王者英雄养成系统|区块狗区块十二生肖养成模式
  6. Java日记本(包含数据库操作)
  7. python去除马赛克
  8. 计算机高职400到430大学,高职考会计专业各高校的录取分数是多少?
  9. java+spring基于ssm的高校学生贫困生资助管理信息系统#毕业设计
  10. 【VIO】第2讲 基于优化的IMU