给定n个点,求到这n个点距离和最小的点,输出最小距离。大体思路就是贪心什么的,选定一个起点(0,0)和一个初始步长,按着距离和小的方向走,走到不能走为止,然后减小步长到原来的1/10,重复上面操作,直到步长小于要求的精度返回,用递归写的。
#include <iostream>
#include <cstdio>
#include <cmath>
#define N 105
using namespace std;
struct Point{
double x,y;
}p[N];
int n;
double dir[8][2]={1,0,0,1,-1,0,0,-1,1,1,1,-1,-1,1,-1,-1};
inline double dis(Point p1,Point p2){
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double get_sum(Point p0){
double ans=0;
for(int i=0;i<n;i++)
ans+=dis(p0,p[i]);
return ans;
}
double dfs(Point p0,double step){
double sum=get_sum(p0),ts;
if(step<0.1) return sum;
Point tp;
for(int i=0;i<8;i++){
tp.x=p0.x+dir[i][0]*step;
tp.y=p0.y+dir[i][1]*step;
ts=get_sum(tp);
if(ts<sum)
return dfs(tp,step);
}
return dfs(p0,step/10.);
}
int main(){
Point p0;
while(~scanf("%d",&n)){
for(int i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
p0.x=0,p0.y=0;
printf("%d\n",int(dfs(p0,100)+0.5));
}
return 0;
}