链接:百度2019前端笔试编程题 来源:牛客网
一个花坛中有很多花和两个喷泉。
喷泉可以浇到以自己为中心,半径为r的圆内的所有范围的花。
现在给出这些花的坐标和两个喷泉的坐标,要求你安排两个喷泉浇花的半径r1和r2,
使得所有的花都能被浇到的同时, r12 + r22 的值最小。
输入描述:
第一行5个整数n,x1,y1,x2,y2表示花的数量和两个喷泉的坐标。
接下来n行,每行两个整数xi, yi表示第i朵花的坐标。
满足1 <= n <= 2000,花和喷泉的坐标满足-107<= x, y <= 107。
输出描述:
一个整数,r12 + r22 的最小值。
示例1
输入
2 -1 0 5 3
0 2
5 2
输出
6
我的思路:利用闭包返回f函数,用来收集每次传入的花朵坐标,当花朵坐标数量为n时,开始计算,对于花朵i,分别计算出它距离两个喷泉的距离r1和r2,两者中取距离最小值保存,相当于由该喷泉负责花朵i,在存储时取该喷泉距离序列中最大值予以保存,这样可以保证喷到最多的花,最后将所有的花朵遍历完成后,返回minR2+minR1即为题目要求的最小值。
function w(n,x1,y1,x2,y2){
let flowers=[]
let r=0,minR2=0,minR1=0
function f(xi, yi){
flowers.push([xi, yi])
if(flowers.length==n){
for(let flower of flowers){
let r1=(x1-flower[0])*(x1-flower[0])+(y1-flower[1])*(y1-flower[1])
let r2=(x2-flower[0])*(x2-flower[0])+(y2-flower[1])*(y2-flower[1])
if(r1>r2){
minR2= Math.max(r2,minR2)
}else{
minR1=Math.max(r1,minR1)
}
}
console.log(minR2+minR1);
return minR2+minR1
}else{
return f
}
}
return f
}
网友评论