[文章目录]
Description
gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty。gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了。蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞。这n根绳子有一个公共的绳结x。吊好gty后蒟蒻们发现由于每个gty重力不同,绳结x在移动。蒟蒻wangxz脑洞大开的决定计算出x最后停留处的坐标,由于他太弱了决定向你求助。不计摩擦,不计能量损失,由于gty足够矮所以不会掉到地上。
说是应当计算力与力臂乘积然后求合力方向,然后进行移动。另外题目个人理解的不清楚啊,以为是平面不会动。然而实际上平面类似一个杠杆,随时在动。所以,我们将距离*力作为评判的标准,进行爬山。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
double ax[11000],ay[11000],g[11000],mi;
double dis(double x,double y)
{
double re=0;
for(int i=1;i<=n;i++)
re+=sqrt((ax[i]-x)*(ax[i]-x)+(ay[i]-y)*(ay[i]-y))*g[i];
return re;
}
double Rand()
{
double re=1.0*(rand()%1000+1)/(1.0*(rand()%1000+1));
if(rand()&1) return -re;
else return re;
}
void work(double &x,double &y,double t)
{
double xx=x+t*Rand(),yy=y+t*Rand(),tmp=dis(xx,yy);
if(tmp<mi) mi=tmp,x=xx,y=yy;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf%lf%lf",&ax[i],&ay[i],&g[i]);
double t=10000.0,x=0,y=0;
mi=dis(x,y);
while(t>1e-5)
{
work(x,y,t);
t*=0.993;
}
printf("%.3lf %.3lf",x,y);
return 0;
}