【物理好有爱】平衡点

【题目描述】
如图:有n个重物,每个重物系在一条足够长的绳子上。每条绳子自上而下穿过桌面上的洞,
然后系在一起。图中X处就是公共的绳结。假设绳子是完全弹性的(不会造成能量损失),桌子足
够高(因而重物不会垂到地上),且忽略所有的摩擦。
问绳结X最终平衡于何处。
注意:桌面上的洞都比绳结X小得多,所以即使某个重物特别重,绳结X也不可能穿过桌面上
的洞掉下来,最多是卡在某个洞口处。

【输入格式】
文件的第一行为一个正整数n(
1≤n≤1000),表示重物和洞的数目。接下来的n行,每行是
3个整数:Xi.Yi.Wi,分别表示第i个洞的坐标以及第 i个重物的重量。(-10000≤x,y≤10000,
 0<w≤1000 )
【输出格式】
你的程序必须输出两个浮点数(保留小数点后三位),分别表示处于最终平衡状态时绳结X
的横坐标和纵坐标。两个数以一个空格隔开。
【样例输入】
3
0 0 1
0 2 1
1 1 1
【样例输出】
0.577 1.000

    这道题看上去有一点计算几何的感觉,到现在也没有弄太熟计算几何的我真的怵了一下XD~

    其实并没有那么复杂,不过在这里要用到一个“逼近”的思想。

.    

    粘代码先:

program balance;
  var
    x,y,v:array[1..1000]of longint;
    xa,ya,xx,yy,k,fx,fy,fn,dx,dy,ft:double;
    i,j,q:longint;
    n:longint;
  begin
    readln(n);
    for i:=1 to n do
      readln(x[i],y[i],v[i]);
    k:=100;
    xa:=0;
    ya:=0;
    for i:=1 to 100 do
      begin
        xx:=xa;
        yy:=ya;
        for q:=1 to 200 do
          begin
            fx:=0;
            fy:=0;
            for j:=1 to n do
              begin
                dx:=x[j]-xx;  //分到x轴的比例
                dy:=y[j]-yy;  //分到y轴的比例
                ft:=sqrt(dx*dx+dy*dy);
                if ft>0 then  //作用点与平衡位置重合时不能够分解
                  begin
                    fx:=fx+dx/ft*v[j];
                    fy:=fy+dy/ft*v[j];
                  end;
              end;
            fn:=sqrt(fx*fx+fy*fy);
            if fn<=k then break;  //小于尺度就跳出
            xx:=xx+fx/fn*k;  //调整平衡点的位置
            yy:=yy+fy/fn*k;
          end;
        xa:=xx;
        ya:=yy;
        k:=k*0.4;  //减小尺度
      end;
    writeln(xa:0:3,' ',ya:0:3);
  end.

      大体思想是这样的:假设一个平衡点,将力正交分解,计算出在此点时的合力。这时将这个合力与一个已经设定好的“尺度”进行比较。如果这时的合力大于这个尺度,我们就对这个已经设定好的平衡点进行调整,让它更加接近真实的平衡点。当合力在尺度以内或者调整一定次数以后,我们减小尺度,再次进行调整。通过不断缩小尺度,将得到的平衡点的精度范围缩小到一定的区域。当精度到达要求值的时候我们就可以输出解了。

      在我的程序里,我用xa,ya表示当前的平衡点位置,fx,fy表示力分解到x轴和y轴的分力,fn是合力的大小,k表示当前的尺度。

      其他的说明在代码里已经体现。而对于q循环和i循环的次数,理论上次数越多精度越高。所以在时间允许的情况下应该尽量增加q和i的循环次数。

.

本文地址:http://www.cnblogs.com/saltless/archive/2011/06/01/2067132.html

(saltless原创,转载请注明出处)

posted on 2011-06-01 16:29  saltless  阅读(735)  评论(0编辑  收藏  举报

导航