生活随笔
收集整理的這篇文章主要介紹了
【2012百度之星 / 资格赛】I:地图的省钱计划
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
描述 百度地圖有自己的一套坐標(biāo)系(你可以把它看作一個笛卡爾坐標(biāo)系),在這套坐標(biāo)系里,一個標(biāo)準(zhǔn)單位為1km。而在這坐標(biāo)系上針對地理信息進(jìn)行標(biāo)注的數(shù)據(jù),大多數(shù)時候是通過購買的方式完成的。為了節(jié)約數(shù)據(jù)更新的成本,數(shù)據(jù)組里的鑫哥想出了一個好主意——自己測數(shù)據(jù)。 鑫哥按照他的預(yù)想開始實驗;在每組試驗中,鑫哥選取了三個已經(jīng)被準(zhǔn)確標(biāo)注在百度地圖的坐標(biāo)系里的移動運(yùn)營商的基站作為信號接收點(diǎn)(這里可以準(zhǔn)確的得到信號的接收時間信息)。當(dāng)信號接收點(diǎn)附近的用戶手機(jī)簽到時,三個信號接收點(diǎn)就會先后接收到這個信號,并可以準(zhǔn)確的知曉接收到信號的時間(將第一個信號點(diǎn)接收到信號的時間記為0秒時刻)。由此,我們就可以確定用戶手機(jī)簽到的位置的在地圖的準(zhǔn)確坐標(biāo)了。 現(xiàn)在已知以下數(shù)據(jù): 1.三個信號接收點(diǎn)在百度地圖坐標(biāo)系中的具體坐標(biāo)(x1,y1), (x2,y2), (x3,y3); 2.三個信號點(diǎn)得到用戶發(fā)出的信號的時間t1, t2, t3(t1, t2, t3 ≥ 0),單位s; t1, t2, t3至少有一個數(shù)為0; 3.信號的轉(zhuǎn)播速度C,單位m/s; 請幫助鑫哥寫個程序,計算下用戶發(fā)出信號的位置在百度地圖坐標(biāo)系內(nèi)的坐標(biāo)(這個點(diǎn)是唯一的)。
輸入 輸入包含多組數(shù)據(jù),每組數(shù)據(jù)格式如下: C x1 y1 x2 y2 x3 y3 t1 t2 t3 最后一組數(shù)據(jù)為0,表示輸入結(jié)束。 輸出 針對每組測試數(shù)據(jù),請先輸出這個組的編號(第n組就是輸出“Case n:”);然后換行輸出信號發(fā)出點(diǎn)的坐標(biāo)(x,y) 。x,y應(yīng)該由空格分隔,并被舍入到小數(shù)點(diǎn)后第六位。 樣例輸入 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
主要思路:這個題用三角函數(shù)來解方程會很方便的,通過將兩個方程轉(zhuǎn)化為一個三角函數(shù)方程,然后求角度cita和半徑r就可以了(特別說明:最后那個分式中的分母部分中的l2、l3是沒有平方的)。
實現(xiàn)代碼:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double x[4], y[4], t[4];void solve(int i , int j , int k)
{double x2, y2, x3, y3, l2, l3 , sum , fai , cita , r , m , n;?? //citax2 = x[j] -x[i] , y2 = y[j] -y[i];x3 = x[k] -x[i] , y3 = y[k] -y[i];l2 = t[j] -t[i] , l3 = t[k] -t[i];m = x2*x2 + y2*y2 - l2*l2 , n = x3*x3 + y3*y3 - l3*l3;// 得到方程 a*sin(cita) + b*cos(cita) = -cdouble a = m*y3-n*y2 ;?? //sin(cita)的系數(shù)double b = m*x3-n*x2 ;?? //cos(cita)的系數(shù)double c = m * l3 - n * l2;// 得到方程 sin(cita+fai) = -c/(sqrt(a*a+b*b))fai = atan2(b, a) ;???? //先求出角度faisum = asin(- c/sqrt(a*a+b*b+1e-15));??? //通過反正弦函數(shù)求出cita+fai的角度和cita = sum - fai;????? // 此時cita是一個銳角if (abs(m)>abs(n))r = m/(l2 + x2 *cos(cita) + y2 * sin(cita))/2;elser = n/(l3 + x3 *cos(cita) + y3 * sin(cita))/2;if(r < 0){sum = - sum + 3.141592653579;??? //r<0,說明不能是銳角,應(yīng)該是個鈍角cita = sum - fai;if (abs(m)>abs(n))r = m/(l2 + x2 *cos(cita) + y2 * sin(cita))/2;elser = n/(l3 + x3 *cos(cita) + y3 * sin(cita))/2;}printf("%.6f %.6f\n", r * cos(cita) + x[i], r * sin(cita) + y[i]);
}
int main(void)
{int num = 1;double c;while(scanf("%lf", &c)!=EOF){c/=1000;if (abs(c) < 1e-6)break;scanf("%lf %lf %lf %lf %lf %lf", x, y, x+1, y+1, x+2, y+2);scanf("%lf %lf %lf", t, t+1, t+2);printf("Case %d:\n", num++);t[0] *= c;t[1] *= c;t[2] *= c;solve(0, 1, 2);}return 0;
}
總結(jié)
以上是生活随笔 為你收集整理的【2012百度之星 / 资格赛】I:地图的省钱计划 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。