洛谷題集 妖夢拼木棒(陣列與map執行效率)

2021-10-06 19:44:44 字數 1413 閱讀 6295

在stl庫中,我們能夠使用map容器自動建立key-value的對應。key 和 value可以是任意你需要的型別。

假如我們將map作為陣列來使用,我們會發現它們的執行效率截然不同!

題目:妖夢拼木棒

洛谷鏈結

有 n 根木棒,現在從中選 4 根,想要組成乙個正三角形,問有幾種選法?

答案對10^9+7取模。

輸入格式

第一行乙個整數 n。

第二行 n 個整數,第 i 個整數 a i

​代表第 i 根木棒的長度。

輸出格式

一行乙個整數代表答案。

輸入輸出樣例

輸入 #1

41 1 2 2

輸出 #1

1說明/提示

資料規模與約定

對於 30% 的資料,保證 n≤5×103。

對於 100% 的資料,保證 1≤n≤10 5,0≤ai ≤5×10 3。

解題思路:

用m陣列或m對映儲存不同長度木棍的數量。

①、找兩根長度為k長棍

②、找兩根短棍長度分別為i,j。

保證:k = i + j

③、統計長度為k的正三角形的數量。

當短棍不相等時

ans = ans+m[k] * (m[k]-1) * m[j] * m[i]/2

當短棍長度相等時

ans = ans + m[k] * (m[k]-1) * m[i] * (m[i]-1) / 4

ps:記得取模mod=1e9+7

用陣列儲存不同長度木棍的數量

#include

#define ll long long

using

namespace std;

const ll mod =

1e9+7;

ll ans =0;

int m[

500010];

intmain()

for(

int k=

1; k<=

5010

; k++

)//短棍相等

else

if(m[i]

>=

2&&i==j)}}

} cout

}

測試平台上能通過100%的資料

而用map容器儲存不同長度木棍的數量

//將上面 m[500010]修改

map<

int,

int> m;

測試平台上僅能通過30%的資料,其他全部超時。

可見 map 容器封裝在 stl 庫中,在儲存 int 型別時,提取資料速度是要慢於陣列。

希望能夠將自己的一些學習經驗分享給有需要的人。

我是小鄭,乙個堅持不懈的小白。

洛谷P3799 妖夢拼木棒

題目鏈結 上道題中,妖夢斬了一地的木棒,現在她想要將木棒拼起來。有n根木棒,現在從中選4根,想要組成乙個正三角形,問有幾種選法?第一行乙個整數n 第二行n個整數,a1,a2,an 0 一行乙個整數,對1e9 7取模 4 1 1 2 2 對於30 的資料 n 5000 對於100 的資料 n 1000...

洛谷P3799 妖夢拼木棒

題目提供者orangebird 標籤難度普及 提高 時空限制1s 128mb 提交 討論 題解上道題中,妖夢斬了一地的木棒,現在她想要將木棒拼起來。有n根木棒,現在從中選4根,想要組成乙個正三角形,問有幾種選法?輸入格式 第一行乙個整數n 第二行n個整數,a1,a2,an 0一行乙個整數,對1e9 ...

洛谷p3799 妖夢切木棒

題意 任選四段木板拼正三角形 因為是正三角形 所以我們可以想到至少是兩個相同的,剩下兩個拼成最後一條邊 我們只需要列舉邊長即可 那麼我們對每次讀入的x,使他的cnt 考慮用乙個二重迴圈 外層列舉邊長的長度 從2到5000 內層列舉用來拼成最後一條邊的其他一根木板 一次迴圈對答案有貢獻 當且僅當邊長的...