在STL庫中,我們能夠使用map容器自動建立Key-value的對應。key 和 value可以是任意你需要的類型。
假如我們將map作爲數組來使用,我們會發現它們的運行效率截然不同!
題目:妖夢拼木棒 洛谷鏈接
有 n 根木棒,現在從中選 4 根,想要組成一個正三角形,問有幾種選法?
答案對10^9+7取模。
輸入格式
第一行一個整數 n。
第二行 n 個整數,第 i 個整數 a i
代表第 i 根木棒的長度。
輸出格式
一行一個整數代表答案。
輸入輸出樣例
輸入 #1
4
1 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<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e9+7;
ll ans = 0;
int m[500010];
int main(){
int n;
cin>>n;
ios::sync_with_stdio(false);
memset(m, 0, sizeof(m));
for(int i=0; i<n; i++){
int a;
cin>>a;
m[a]++;
}
for(int k=1; k<=5010; k++){
//找兩根長棍
if(m[k]>=2){
//找兩根短棍
for(int j=1; j<=k/2; j++){
int i=k-j;
//短棍不相等
if(m[j]>=1&&m[i]>=1&&i!=j){
ans=(ans+((m[k]*(m[k]-1)*m[j]*m[i])/2)%mod)%mod;
}
//短棍相等
else if(m[i]>=2&&i==j){
ans=(ans+((m[k]*(m[k]-1)*m[i]*(m[i]-1))/4)%mod)%mod;
}
}
}
}
cout<<ans;
return 0;
}
測試平臺上能通過100%的數據
而用map容器存儲不同長度木棍的數量
//將上面 m[500010]修改
map<int, int> m;
測試平臺上僅能通過30%的數據,其他全部超時。
可見 map 容器封裝在 STL 庫中,在存儲 int 類型時,提取數據速度是要慢於數組。
希望能夠將自己的一些學習經驗分享給有需要的人。
我是小鄭,一個堅持不懈的小白。