2021-04-30:一条直线上有居民点,邮局只能建在居民点上。给定一个有序正数数组arr,每个值表示 居民点的一维坐标,再给定一个正数 num,表示邮局数量。选择num个居民点建立num个 邮局,使所有的居民点到最近邮局的总距离最短,返回最短的总距离。【举例】arr=[1,2,3,4,5,1000],num=2。第一个邮局建立在 3 位置,第二个邮局建立在 1000 位置。那么 1 位置到邮局的距离 为 2, 2 位置到邮局距离为 1,3 位置到邮局的距离为 0,4 位置到邮局的距离为 1, 5 位置到邮局的距 离为 2,1000 位置到邮局的距离为 0。这种方案下的总距离为 6, 其他任何方案的总距离都不会 比该方案的总距离更短,所以返回6。

福大大 答案2021-04-30:

动态规划。

代码用golang编写。代码如下:

package main

import (
"fmt"
"math"
) func main() {
arr := []int{1, 2, 3, 4, 5, 1000}
num := 2
ret := min1(arr, num)
fmt.Println(ret) //ret = min2(arr, num)
//fmt.Println(ret)
} func min1(arr []int, num int) int {
if num < 1 || len(arr) < num {
return 0
}
N := len(arr)
w := make([][]int, N+1)
for i := 0; i < N+1; i++ {
w[i] = make([]int, N+1)
}
for L := 0; L < N; L++ {
for R := L + 1; R < N; R++ {
w[L][R] = w[L][R-1] + arr[R] - arr[(L+R)>>1]
}
} dp := make([][]int, N)
for i := 0; i < N; i++ {
dp[i] = make([]int, num+1)
}
for i := 0; i < N; i++ {
dp[i][1] = w[0][i]
}
for i := 1; i < N; i++ {
for j := 2; j <= getMin(i, num); j++ {
ans := math.MaxInt32
for k := 0; k <= i; k++ {
ans = getMin(ans, dp[k][j-1]+w[k+1][i])
}
dp[i][j] = ans
}
}
return dp[N-1][num]
} func getMin(a int, b int) int {
if a < b {
return a
} else {
return b
}
} //func min2(arr []int, num int) int {
// if num < 1 || len(arr) < num {
// return 0
// }
// N := len(arr)
// w := make([][]int, N+1)
// for i := 0; i < N+1; i++ {
// w[i] = make([]int, N+1)
// }
// for L := 0; L < N; L++ {
// for R := L + 1; R < N; R++ {
// w[L][R] = w[L][R-1] + arr[R] - arr[(L+R)>>1]
// }
// }
//
// dp := make([][]int, N)
// for i := 0; i < N; i++ {
// dp[i] = make([]int, num+1)
// }
//
// best := make([][]int, N)
// for i := 0; i < N; i++ {
// best[i] = make([]int, num+1)
// }
// for i := 0; i < N; i++ {
// dp[i][1] = w[0][i]
// best[i][1] = -1
// }
// for j := 2; j <= num; j++ {
// for i := N - 1; i >= j; i-- {
// down := best[i][j-1]
// up := twoSelectOne(i == N-1, N-1, best[i+1][j])
// ans := math.MaxInt32
// bestChoose := -1
// for leftEnd := down; leftEnd <= up; leftEnd++ {
// leftCost := twoSelectOne(leftEnd == -1, 0, dp[leftEnd][j-1])
// rightCost := twoSelectOne(leftEnd == i, 0, w[leftEnd+1][i])
// cur := leftCost + rightCost
// if cur <= ans {
// ans = cur
// bestChoose = leftEnd
// }
// }
// dp[i][j] = ans
// best[i][j] = bestChoose
// }
// }
// return dp[N-1][num]
//} func twoSelectOne(isSelectFirst bool, a int, b int) int {
if isSelectFirst {
return a
} else {
return b
}
}

执行结果如下:


左神java代码

2021-04-30:一条直线上有居民点,邮局只能建在居民点上。给定一个有序正数数组arr,每个值表示 居民点的一维坐标,再给定一个正数 num,表示邮局数量。选择num个居民点建立num个 邮局,使的更多相关文章

  1. 判断两条直线的位置关系 POJ 1269 Intersecting Lines

    两条直线可能有三种关系:1.共线     2.平行(不包括共线)    3.相交. 那给定两条直线怎么判断他们的位置关系呢.还是用到向量的叉积 例题:POJ 1269 题意:这道题是给定四个点p1, ...

  2. LeetCode:149_Max Points on a line | 寻找一条直线上最多点的数量 | Hard

    题目:Max Points on a line Given n points on a 2D plane, find the maximum number of points that lie on ...

  3. lintcode 中等题:Max Points on a Line 最多有多少个点在一条直线上

    题目 最多有多少个点在一条直线上 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. ...

  4. 一条直线上N个线段所覆盖的总长度

    原文:http://blog.csdn.net/bxyill/article/details/8962832 问题描述: 现有一直线,从原点到无穷大. 这条直线上有N个线段.线段可能相交. 问,N个线 ...

  5. lintcode-186-最多有多少个点在一条直线上

    186-最多有多少个点在一条直线上 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. ...

  6. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. 30多条mysql数据库优化方法【转】

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  8. 转载:30多条mysql数据库优化方法,千万级数据库记录查询轻松解决

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  9. 两条直线(蓝桥杯)二分枚举+RMQ

    算法提高 两条直线   时间限制:1.0s   内存限制:256.0MB        问题描述 给定平面上n个点. 求两条直线,这两条直线互相垂直,而且它们与x轴的夹角为45度,并且n个点中离这两条 ...

  10. 多人开发的git项目如何保持提交日志为一条直线?

    多人开发的git项目如何保持提交日志为一条直线? 一.Git的项目的git常用操作 a)Git clone 项目地址 从远程仓库克隆项目到本地 b)Git pull 从当前分支拉取更新代码 c)Git ...

随机推荐

  1. windows下使用Wireshark调试chrome浏览器的HTTP/2流量

    1.在Wireshark官网(https://www.wireshark.org/#download)下载对应的Wireshark安装包,进行安装 2.增加系统环境变量设置(计算机 -- 右键 -- ...

  2. mysql中exists的用法简答

    前言在日常开发中,用mysql进行查询的时候,有一个比较少见的关键词exists,我们今天来学习了解一下这个exists这个sql关键词的用法,这样在工作中遇到一些特定的业务场景就可以有更加多样化的解 ...

  3. progress监视linux命令进程

    progress监视linux命令进程 可以查看哪些命令进程 cp mv tar dd gzip cat grep 如何在ubuntu安装 sudo apt install progress 使用方法 ...

  4. Monkey二次开发 -- Monkey jar包构建

      前面已经下载好了Android源码,可以在对应目录下构建二次开发后的monkey jar包了:   当前环境:Ubuntu16.04,Andorid10源码. 1.初始化环境   cd进入andr ...

  5. java注解与反射--2

    java注解与反射--2 反射:java.Reflection 因为反射,使java具有了一定的动态性. java反射机制概述 动态语言: 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至 ...

  6. JS逆向实战12——某店 captchaToken 参数 加密

    今天爬取的是网站需要模拟登陆 目标网站 aHR0cHM6Ly9wYXNzcG9ydC55aGQuY29tL3Bhc3Nwb3J0L2xvZ2luX2lucHV0LmRv 浏览器抓包分析 随便输入一堆假 ...

  7. 7.远程代码执行漏洞RCE

    远程代码执行漏洞RCE 1.RCE Remote Code Execute 远程代码执行 Remote Command Execute 远程命令执行 2.危害 窃取服务器的敏感数据.文件 对电脑的文件 ...

  8. Java高频面试题(2023最新整理)

    Java的特点 Java是一门面向对象的编程语言.面向对象和面向过程的区别参考下一个问题. Java具有平台独立性和移植性. Java有一句口号:Write once, run anywhere,一次 ...

  9. linux防火墙开放1521端口

    问题描述:使用plsql连接数据库发现TNS报错,登录服务器发现防火墙开放,如果直接关闭防火墙,所有的端口都可以连接,但是实际中可能会遇到开启防火墙的库,这时候需要开放单一端口对某一服务器或者某一网段 ...

  10. Docker中Nginx搭建以及配置

    docker nginx搭建 1 docker pull nginx docker pull nginx 2 启动nginx docker run --name nginx -p 80:80 -d n ...