【2012百度之星 / 资格赛】I:地图的省钱计划

时间限制: 
1000ms 
内存限制: 
65536kB
描述

百度地图有自己的一套坐标系(你可以把它看作一个笛卡尔坐标系),在这套坐标系里,一个标准单位为1km。而在这坐标系上针对地理信息进行标注的数据,大多数时候是通过购买的方式完成的。为了节约数据更新的成本,数据组里的鑫哥想出了一个好主意——自己测数据。
鑫哥按照他的预想开始实验;在每组试验中,鑫哥选取了三个已经被准确标注在百度地图的坐标系里的移动运营商的基站作为信号接收点(这里可以准确的得到信号的接收时间信息)。当信号接收点附近的用户手机签到时,三个信号接收点就会先后接收到这个信号,并可以准确的知晓接收到信号的时间(将第一个信号点接收到信号的时间记为0秒时刻)。由此,我们就可以确定用户手机签到的位置的在地图的准确坐标了。
现在已知以下数据:
1.三个信号接收点在百度地图坐标系中的具体坐标(x1,y1), (x2,y2), (x3,y3);
2.三个信号点得到用户发出的信号的时间t1, t2, t3(t1, t2, t3 ≥ 0),单位s; t1, t2, t3至少有一个数为0;
3.信号的转播速度C,单位m/s;
请帮助鑫哥写个程序,计算下用户发出信号的位置在百度地图坐标系内的坐标(这个点是唯一的)。

输入
输入包含多组数据,每组数据格式如下:
C
x1 y1 x2 y2 x3 y3
t1 t2 t3
最后一组数据为0,表示输入结束。
输出
针对每组测试数据,请先输出这个组的编号(第n组就是输出“Case n:”);然后换行输出信号发出点的坐标(x,y) 。x,y应该由空格分隔,并被舍入到小数点后第六位。
样例输入
1000
0 1 1 1 2 1
0 0.6 1.6
1000
0 0 0 1 1 0
0.4142135 0 0
1000
0 0 1 0 2 1
0 0.414213562373 1
1000
0 0 0 -1 0 1
0 0 1
1000
0 0 0 1 0 -1
0 1 0
1000
0 0 1 0 -1 0
0 1 0
1000
0 0 -1 0 1 0
0 0 1
100
0 0 0 1 1 0
0 10 10
0
样例输出
Case 1:
0.200000 1.000000
Case 2:
1.000000 1.000000
Case 3:
0.000000 1.000000
Case 4:
0.000000 -0.500000
Case 5:
0.000000 -0.500000
Case 6:
-0.500000 0.000000
Case 7:
-0.500000 0.000000
Case 8:
0.000000 0.000000


【题解】

解方程!!!!!!

还要分类讨论!!!!

直接给代码

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int cc=0;
int main()
{
    freopen("in.txt","r",stdin);
    double T,P,tt,c,A,B,k,b,m,n,p,q,r,u,v,w,d,xa,ya,sa,sb,xb,yb,x1,yy1,x2,y2,x3,y3,t1,t2,t3;
    while (cin >> c)
    {
        if (c==0) break;
        c/=1000;
        cc++;
        printf("Case %d:\n",cc);
        cin >> x1 >> yy1 >> x2 >> y2 >> x3 >> y3;
        cin >> t1 >> t2 >> t3;
        if (t1==0 && t2==0 && t3==0)
        {
            A=(x1+x2+x3)/3;
            B=(yy1+y2+y3)/3;
            printf("%.6f %.6f\n",A,B);
        }
        if (t1!=0)
        {
            if (t2==0)
            {
                swap(t1,t2);
                swap(x1,x2);
                swap(yy1,y2);
            }
            else if (t3==0)
            {
                swap(t1,t3);
                swap(x1,x3);
                swap(yy1,y3);
            }
        }
        if (t2==0)
        {
            swap(t2,t3);
            swap(x2,x3);
            swap(y2,y3);
        }
        A=x2*x2+y2*y2-x1*x1-yy1*yy1-c*c*t2*t2;
        B=x3*x3+y3*y3-x1*x1-yy1*yy1-c*c*t3*t3;
        tt=(yy1-y2)*t3-(yy1-y3)*t2;
        if (-1e-8<tt && tt<1e-8)
        {
            xa=xb=(A*t3-B*t2)/(2*(x1-x3)*t2-2*(x1-x2)*t3);
            T=2*(x1-x2)*xa+A;
            P=2*(yy1-y2);
            T/=2*c*t2;
            P/=2*c*t2;
            u=P*P-1;
            v=2*P*T+2*yy1;
            w=T*T-(xa-x1)*(xa-x1)-yy1*yy1;
            d=v*v-4*u*w;
            if (-1e-8<d && d<0) d=-d;
            if (-1e-8<u && u<1e-8)
                ya=yb=-w/v;
            else
            {
                ya=(sqrt(d)-v)/2/u;
                yb=(-sqrt(d)-v)/2/u;
            }
            sa=2*(x1-x3)*xa+2*(yy1-y3)*ya+x3*x3+y3*y3-x1*x1-yy1*yy1;
            sb=2*c*t3*sqrt((xa-x1)*(xa-x1)+(ya-yy1)*(ya-yy1));
            if (-1e-8<xa && xa<1e-8) xa=0;
            if (-1e-8<xb && xb<1e-8) xb=0;
            if (-1e-8<ya && ya<1e-8) ya=0;
            if (-1e-8<yb && yb<1e-8) yb=0;
            if (sa==sb)
                printf("%.6f %.6f\n",xa,ya);
            else
                printf("%.6f %.6f\n",xb,yb);
            continue;
        }
        k=((x1-x3)*t2-(x1-x2)*t3)/tt;
        b=(B*t2-A*t3)/(2*tt);
        if (-1e-8<k && k<1e-8)
        {
            ya=yb=b;
            P=2*(x1-x2);
            T=2*(yy1-y2)*ya+A;
            T/=2*c*t2;
            P/=2*c*t2;
            u=P*P-1;
            v=2*P*T+2*x1;
            w=T*T-x1*x1-(ya-yy1)*(ya-yy1);
            d=v*v-4*u*w;
            if (-1e-8<d && d<0) d=-d;
            if (-1e-8<u && u<1e-8)
                xa=xb=-w/v;
            else
            {
                xa=(sqrt(d)-v)/2/u;
                xb=(-sqrt(d)-v)/2/u;
            }
            sa=2*(x1-x3)*xa+2*(yy1-y3)*ya+x3*x3+y3*y3-x1*x1-yy1*yy1;
            sb=2*c*t3*sqrt((xa-x1)*(xa-x1)+(ya-yy1)*(ya-yy1));
            if (-1e-8<xa && xa<1e-8) xa=0;
            if (-1e-8<xb && xb<1e-8) xb=0;
            if (-1e-8<ya && ya<1e-8) ya=0;
            if (-1e-8<yb && yb<1e-8) yb=0;
            if (-1e-8<sa-sb && sa-sb<1e-8)
                printf("%.6f %.6f\n",xa,ya);
            else
                printf("%.6f %.6f\n",xb,yb);
            continue;
        }
        if (-1e-8<b && b<1e-8) b=0;
        m=2*(x1-x2)+2*(yy1-y2)*k;
        n=2*(yy1-y2)*b+A;
        p=(k*k+1)*4*c*c*t2*t2;
        q=(x1*x1+b*b-2*b*yy1+yy1*yy1)*4*c*c*t2*t2;
        r=(2*k*b-2*x1-2*k*yy1)*4*c*c*t2*t2;
        u=m*m-p;
        v=2*m*n-r;
        w=n*n-q;
        d=v*v-4*u*w;
        if (-1e-8<d && d<0) d=-d;
        if (-1e-8<u && u<1e-8)
            xa=xb=-w/v;
        else
        {
            xa=(sqrt(d)-v)/2/u;
            xb=(-sqrt(d)-v)/2/u;
        }
        ya=k*xa+b;
        yb=k*xb+b;
        sa=2*(x1-x3)*xa+2*(yy1-y3)*ya+B;
        sb=2*c*t3*sqrt((xa-x1)*(xa-x1)+(ya-yy1)*(ya-yy1));
        if (-1e-8<xa && xa<1e-8) xa=0;
        if (-1e-8<xb && xb<1e-8) xb=0;
        if (-1e-8<ya && ya<1e-8) ya=0;
        if (-1e-8<yb && yb<1e-8) yb=0;
        if (-1e-8<sa-sb && sa-sb<1e-8)
            printf("%.6f %.6f\n",xa,ya);
        else
            printf("%.6f %.6f\n",xb,yb);
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值