洛谷題集——妖夢拼木棒(數組與map運行效率)

在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 類型時,提取數據速度是要慢於數組。

希望能夠將自己的一些學習經驗分享給有需要的人。
我是小鄭,一個堅持不懈的小白。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章