BZOJ-3680: 吊打XXX

[文章目录]

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

发表评论

邮箱地址不会被公开。 必填项已用*标注