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;
}

  

原文地址:https://www.cnblogs.com/clrs97/p/4403224.html