遞推 HDU 2073 無限的路 (找規律)

2022-05-16 22:48:12 字數 1322 閱讀 5381

意外之喜  還挺不錯的一道題目

仔細觀察不難發現   其實整個路線只有這兩種線(綠色跟紅色)

並且在移動過程中[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 2

using

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 甜甜從小就喜歡畫圖畫,最近他買了一支智慧型畫筆,由於剛剛接觸,所以甜甜只會用它來畫直線,於是他就在平面直角座標系中畫出如下的圖形 甜甜的好朋友蜜蜜發現上面的圖還是有點規則的,於是他問甜甜 在你畫的圖中,我給你兩個點,請你算一算連線兩點的折線長度 即沿折線走的路...