向量(高階的隨機化應用)

cn是大帅哥886發表於2024-08-20
https://www.luogu.com.cn/problem/AT_abc139_f

向量(x1,y1)和向量(x2,y2)的加法是向量運算的基本操作之一。在二維平面上,向量(x1,y1)表示從原點(0,0)到點(x1,y1)的有向線段,而向量(x2,y2)表示從原點(0,0)到點(x2,y2)的有向線段。當我們將這兩個向量相加時,我們得到一個新的向量,其座標是這兩個向量座標的對應分量之和。具體地,向量(x1,y1)和向量(x2,y2)的和向量的座標是(x1+x2,y1+y2).這個新的向量(x1+x2,y1+y2)表示從原點(0,0)到點(x1+x2,y1+y2)的有向線段。例如,向量(2,3)和向量(1,-1)的和是(2+1,3+(-1)),即(3,2)。給定n個向量,選出一些向量使得它們和的模長最大。求最大的模長。向量的模長(或稱為向量的長度、大小、絕對值)是一個非負實數,表示向量在空間中“伸展“的程度。對於二維平面上的向量(x,y),其模長計算公式為:模長=sqrt(x^2+y^2)。

輸入格式

第一行一個數n

接下來n行,每行兩個整數x[i],y[i],表示一個向量。

1<=n<=100,-1000000<=x[i]<=1000000,-1000000<=y[i]<=1000000

輸出格式

一個數,保留一位小數。

輸入/輸出例子1

輸入:

3

0 10

5 -5

-5 -5

輸出:

10.0

樣例解釋

做法一:

注意到 n 的範圍比較小,可以考慮揹包

f(i, j): 對於x向量,考慮前i個向量,選j個,滿足是最大模長的前提下,x的和(這裡不是最大模長,而是x的和,因為方便後面計算)

g(i, j): 對於y向量,考慮前i個向量,選j個,滿足是最大模長的前提下,y的和(同上)

轉移:選和不選

不選:f(i, j)=f(i-1, j), g(i, j)=g(i-1, j)

選:選了當前x,y,要滿足是最大模長,才進行轉移: f(i, j)=f(i-1, j-1)+x, g(i, j)=g(i-1, j-1)+y

答案:max(f[n][i]),其中i<=n

但是由於向量的順序不一樣,會導致求出的答案出錯。(dp是全域性最優性,而本題是區域性最優性,這兩個不匹配)

錯誤例子:

輸入:

4
29 -74
-81 -11
63 73
-100 -13

輸出:

182.6

模擬一下,易得,

f[1][0]:0.0
f[2][0]:0.0 f[2][1]:-81.0
f[3][0]:0.0 f[3][1]:63.0 f[3][2]:-52.0
f[4][0]:0.0 f[4][1]:-100.0 f[4][2]:-52.0 f[4][3]:-152.0

g[1][0]:0.0

g[2][0]:0.0 g[2][1]:-11.0
g[3][0]:0.0    g[3][1]:73.0    g[3][2]:-85.0
g[4][0]:0.0    g[4][1]:-13.0    g[4][2]:-85.0  g[4][3]:-98.0

答案是錯的,得出的是180.9

但是發現,把序列改成:

29 -74
-81 -11
-100 -13
63 73

f[1][0]:0.0
f[2][0]:0.0    f[2][1]:-100.0
f[3][0]:0.0    f[3][1]:-100.0   f[3][2]:-71.0
f[4][0]:0.0    f[4][1]:-100.0    f[4][2]:-181.0   f[4][3]:-152.0


g[1][0]:0.0

g[2][0]:0.0    g[2][1]:-13.0
g[3][0]:0.0    g[3][1]:-13.0    g[3][2]:-87.0
g[4][0]:0.0   g[4][1]:-13.0    g[4][2]:-24.0    g[4][3]:-98.0

那麼dp出來就是對的了。答案是182.6

所以我們可以多次隨機化,再對每一次隨機化後的向量進行 dp,這樣就可以求出答案了。(資料大就沒了)


做法二:
極角排序:

暫時不會

相關文章