浇花
Talk is cheap, show you my code
class Point2D:
def __init__(self,
x,
y,
):
self.x = x
self.y = y
def get_dist_sqr(self, x, y):
return (self.x - x) ** 2 + (self.y - y) ** 2
input_para_1 = list(map(int, input().split()))
num_of_fl = input_para_1[0]
sp1 = Point2D(input_para_1[1], input_para_1[2])
sp2 = Point2D(input_para_1[3], input_para_1[4])
list_of_dist = [(0, 0)]
for i in range(0, num_of_fl):
input_para_2 = list(map(int, input().split()))
fl = Point2D(input_para_2[0], input_para_2[1])
dist_1 = fl.get_dist_sqr(sp1.x, sp1.y)
dist_2 = fl.get_dist_sqr(sp2.x, sp2.y)
del fl
list_of_dist.append((dist_1, dist_2))
list_of_dist = sorted(list_of_dist, key=lambda x: x[0])
list_of_dist.append((0, 0))
# 取出排序后的列
list_of_dist_1 = []
for di in list_of_dist:
list_of_dist_1.append(di[0])
list_of_dist_2 = []
for di in list_of_dist:
list_of_dist_2.append(di[1])
res = 2 ** 64
for j in range(1, num_of_fl + 2):
r1 = max(list_of_dist_1[:j])
r2 = max(list_of_dist_2[j:])
if res > (r1 + r2):
res = r1 + r2
print(res)
解释:
涉及知识:排序、穷举、贪心
思路:
1.构造二维点的类,其中附加一个【求到点距离】的方法
2.用输入的数字构造点,并求距离
3.将N朵花每朵到1,2号喷泉的距离(dist1, dist2)写成一个N*2二维数组
4.按照到1号喷泉的距离排序(第一列),前i朵为喷泉1负责,i+1~N朵由喷泉2负责
5.比如:
|--1--|-----|
|--1--|-----|
|--1--|-----|
|--1--|-----|
|--1--|-----|
|-----|--2--|
|-----|--2--|
|-----|--2--|
6.找出1负责区中,最远的花的距离作为r1,2负责区最远的花的距离为r2
7,试想:遍历1~N朵花,找到最小的r1+r2,即为输出的result
8.考虑到,可能存在N朵全部为喷泉1负责,或者全部由2负责,即存在r1=0或r2=0
在排序后数组的头和尾添加(0,0),即可不设例外地运行之前的算法
即:
(0,0)
(dist1a, dist2a)
(dist1b, dist2b)
...
(0,0)

京公网安备 11010502036488号