题目描述:
一家快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心 到所有区域的距离的总和最小。
给你一个数组 positions ,其中 positions[i] = [left, right] 表示第 i 个区域在街道上的位置,其中 left 代表区域的左侧的起点, right 表示区域的右侧终点,设择服务中心的位置为 location。
如果第 i 个区域的右侧起点 right 满足 right < location ,则第 i 个区域到服务中心的距离为 location - right;
如果第 i 个区域的左侧起点 left 满足 left > location ,则第 i 个区域到服务中心的距离为 left - location;
如果第 i 个区域的两侧 left, right 满足 left <= location <= right ,则第 i 个区域到服务中心的距离为 0;
选择最佳的服务中心的位置为 location ,请返回最佳的服务中心位置到所有区域的距离总和的最小值。
输入描述:
先输入区域数组positions的长度n(1 <= n <= 10^5)
接下来n行每行输入成对的left和right值,以空格隔开
-10^9 <left <= 10^9
-10^9 <right<= 10^9
输出描述:
输出为location
补充说明:
不同的 positions 的区间可能存在重叠;
location 的位置可以有多个
收起
示例1
输入:
3
1 2
3 4
10 20
输出:
8
说明:
我们选择最佳服务中心位置为3,此时3到 区域[1,2]的距离为1, 3到区域[3,4]的距离为0,3到区域[10,20]的距离为7。最小的距离为8。
示例2
输入:
2
1 4
4 5
输出:
0
说明:
我们选择最佳服务中心位置可以选择4,此时的最小距离为0
示例3
输入:
4
1 3
2 6
8 10
15 18
输出:
14
说明:
我们选择最佳服务中心位置可以选择7,此时的最小距离为14
sumInput=int(input())
myList=[]
for i in range(sumInput):
myList.append(list(map(int,input().split())))
def execuMath(leftPos,rightPos,Pos):
if Pos<leftPos:
return abs(leftPos-Pos)
elif Pos>rightPos:
return abs(Pos-rightPos)
else:
return 0
minNum=myList[0][0]
maxNum=myList[0][1]
for i in range(len(myList)):
minNum=min(myList[i][0],minNum)
maxNum=max(myList[i][1],maxNum)
temp=0
for k in range(len(myList)):
temp+=execuMath(myList[k][0],myList[k][1],minNum)
outPutNum=temp
for j in range(minNum+1,maxNum+1):
res=0
for k in range(len(myList)):
res+=execuMath(myList[k][0],myList[k][1],j)
outPutNum=min(res,outPutNum)
print(outPutNum)