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;

}

  

 

你可能感兴趣的:(ZOJ)