BZOJ3680 : 吊打XXX
本题就是找一个受力平衡的点
我们一开始假设这个点是(0,0)
然后求出它受到的力,将合力正交分解后朝着合力的方向走若干步,并不断缩小步长,一步步逼近答案
#include<cstdio> #include<cmath> #define N 10000 int n,i;double x[N],y[N],w[N],a,b,sumx,sumy,dx,dy,dis,step=1; double sqr(double x){return x*x;} int main(){ for(scanf("%d",&n);i<n;i++)scanf("%lf%lf%lf",x+i,y+i,w+i); while(step>1e-8){ for(sumx=sumy=i=0;i<n;i++){ if((dis=std::sqrt(sqr(dx=x[i]-a)+sqr(dy=y[i]-b)))<=1e-10)continue; sumx+=dx*w[i]/dis,sumy+=dy*w[i]/dis; } a+=sumx*step,b+=sumy*step,step*=0.97; } return printf("%.3f %.3f",a,b),0; }