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. Javaweb问题解决--在.java文件里面写sql语句模糊查询不成功的原因

    问题描述 在上学期,我就遇到了这个问题(别骂别骂),然后当时卡住之后,Mybatis闯入了我的视线,然后直接换用了较为方便的Mybatis框架结构,这个问题也就被搁置了,今天重新提起,优势慢慢地查阅了 ...

  2. Eigen 中的 conservativeResize 和 resize 操作

    Eigen 中的 conservativeResize 和 resize 操作 对于能够改变大小的动态矩阵,一般会有 resize() 操作. resize() 如果不改变原矩阵的大小,则原矩阵大小和 ...

  3. 学习ASP.NET Core Blazor编程系列三十——JWT登录(4)

    学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...

  4. MyBatisPlus---DQL编程控制

    MP将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合. 一.条件查询 package com.itheima; import com.baomidou.mybatisplus.c ...

  5. odoo 开发入门教程系列-安全-简介

    安全-简介 前一章中我们已经创建了第一个打算用于存储业务数据的表.在odoo这样的一个商业应用中,第一个考虑的问题就是谁(Odoo 用户(或者组用户))可以访问数据.odoo为指定用户组用户提供了一个 ...

  6. go语言之UDP通信

    服务端 package main import ( "fmt" "net" ) func main() { listen, err := net.ListenU ...

  7. CISCN2021-第十四届全国大学生信息安全竞赛-WriteUp

    WriteUp - Maple_root -CISCN2021 总结 总得分:3400 总排名:203 赛区排名:21 第一次认真参加正式的CTF,24+3小时的脑血栓比赛时长,收获还是很多的. 开卷 ...

  8. Java------常用类(二)

    import org.junit.Test; import java.io.UnsupportedEncodingException; import java.util.Arrays; /** * 涉 ...

  9. Chrome浏览器插件 Undo Close Tab (恢复关掉的标签页)

    背景 如果您经常使用Chrome浏览器,也许有时候会意外关闭一个标签页,从而丢失您正在查看的内容.这时您可能会感到非常烦恼,并希望能够迅速找回这个标签页.当然,您可以通过点击浏览器历史记录中的条目来找 ...

  10. [大数据]sqoop安装与运用

    1 文由 项目使用场景:OLTP Oracle 数据导入到 OLAP HIVE 2 Sqoop简述 Apache Sqoop(TM) 是一款开源的ETL工具,设计用于在 Apache Hadoop和结 ...