意外之喜 還挺不錯的一道題目
仔細觀察不難發現 其實整個路線只有這兩種線(綠色跟紅色)
並且在移動過程中[x,y]的改變(紅線部分)總是遵循這兩種規律[x+1,y-1]或者[x-1,y+1],設x+y=z
在同一條紅線中z的值是不變的
既然如此 我們不如直接用x+y來計算紅線部分的總值,忽略x與y的具體數值
我們定義乙個陣列p1[z]來儲存紅線的字首和
計算公式也很容易看出來p1[0] = 0; p[i] = p[i-1]+i*g; // double g = sqrt(2); 很容易看出來 第i條紅線恰好有條長度為sqrt(2)的線段
那麼現在紅線部分就搞定了
接下來定義乙個陣列p2[z]來儲存綠線的字首和
同樣用開平方根的方式計算第x跟綠線的長度 第x根綠線的長度為sqrt(x^2+(x+1)^2);
p2[0] = 0; p2[i] = p[i-1]+sqrt(i^2+(i-1)^2);
此時我們只需要判斷出給出的座標點位於哪條紅線上,將這條紅線之前的字首和加到sum上
再根據x的值判斷這之前有多少條綠線 再將這些綠線的字首和加到sum上
現在就只剩下最後乙個問題了 即加上最後一段的距離
比如計算[3,1](距離[0,0])的長度
加上前(3+1)-1條紅線 再加上前(3+1)條綠線 再加上最後一段的距離
對於[3,1],最後一段的距離是[0,4]->[1,3]->[2,2]->[3,1];(發現恰好為三個g的距離)
再嘗試觀察幾個其他的點 發現最後一段距離恰好為x個g的距離
那麼公式就出來了 sum[x,y]=p1[x+y-1]+p2[x+y]+x*g;
那麼我們只需要計算一次[x1,y1]的sum,再計算一次[x2,y2]的sum進行相減取絕對值
最後的結果便出來了
1 #include 2using
namespace
std;
3double p1[210],p2[210];4
double g = sqrt(2);5
intmain()624
return0;
25 }
HDU2073 無限的路
純幾何題。題目是讓求兩點之間的折線距離,很自然的就可以想到分別求出兩點到原點的距離,然後相減即可,本題沒說兩點的先後,再多一步取絕對值就ok了。求一點到原點之間的距離,可以把折線分成兩部分,很容易可以看出,一部分是sqrt 2 的整數倍,另一部分寫幾個就很容易看出,依次是sqrt 1 1 2 2 s...
hdu2073 無限的路
這道題吧我覺得還是有點思維量的。思路 1.我們要求的是兩點之間的距離,可以轉化為點到原點的距離,然後相減。2.首先看這張圖分為兩種線 一種是有點的線 如 0,1 與 1,0 的線 0,2 與 2,0 的線 一種是沒有點的線 如 0,1 與 0,0 的線 0,2 與 1,0 的線,0,3 與 2,0 ...
HDU 2073 無限的路
problem description 甜甜從小就喜歡畫圖畫,最近他買了一支智慧型畫筆,由於剛剛接觸,所以甜甜只會用它來畫直線,於是他就在平面直角座標系中畫出如下的圖形 甜甜的好朋友蜜蜜發現上面的圖還是有點規則的,於是他問甜甜 在你畫的圖中,我給你兩個點,請你算一算連線兩點的折線長度 即沿折線走的路...