可以把最终目标确定为最小化
∑i=1ndis(i,o)∗w[i]
∑
i
=
1
n
d
i
s
(
i
,
o
)
∗
w
[
i
]
,这是啥广义费马点?
然后可以爬山、模拟退火来搞。
这里讲的不错:portal
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 10010
int n;
struct point{
double x,y,w;
}a[N];
double ansx,ansy,ans;
inline double sqr(double x){return x*x;}
inline double calc(double x,double y){
double res=0;
for(int i=1;i<=n;++i) res+=a[i].w*sqrt(sqr(a[i].x-x)+sqr(a[i].y-y));
return res;
}
inline double randf(){
return rand()*1.0/RAND_MAX;
}
int main(){
// freopen("a.in","r",stdin);
srand(20000711);scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].w);
ansx+=a[i].x;ansy+=a[i].y;
}ansx/=n;ansy/=n;ans=calc(ansx,ansy);
double t=1e5;
for(;t>1e-4;t*=0.98){
double x=ansx+t*(randf()*2-1),y=ansy+t*(randf()*2-1);
double res=calc(x,y);
if(res<ans) ans=res,ansx=x,ansy=y;
}printf("%.3lf %.3lf\n",ansx,ansy);
return 0;
}