題目敘述:https://vjudge.net/problem/SPOJ-ABCDEF
相同題目:a064: SPOJ 4580.ABCDEF
解題想法:枚舉 + unordered_map
- 六個變數 a, b, c, d, e, f 來自同一個集合,求滿足算式的組合數目。
- (做法I) 用六層for-loop暴力枚舉:TLE
- (做法II) 將原算式整理成 a * b + c = (e + f) * d, d != 0
- 用三層for-loop枚舉 (a, b, c) 的可能組合數,紀錄於map。
- 再用三層for-loop枚舉 (d, e, f) 的計算結果,與上述結果吻合者加總到答案中。
- 注意:vjudge的時間要求比ZeroJudge嚴格,map需改成unordered_map,前者查找的時間複雜度為O(log(N)),後者為O(1)。
#include <iostream>
#include <unordered_map>
using namespace std;
int main(){
int N;
cin >> N;
int S[N];
for (int i=0; i<N; i++){
cin >> S[i];
}
unordered_map<int, int> mp;
for (auto a: S){
for (auto b: S){
for (auto c: S){
mp[a*b+c]++;
}
}
}
int ans = 0;
for (auto d: S){
if (d == 0) continue;
for (auto e: S){
for (auto f: S){
int tmp = (e+f)*d;
if (mp.count(tmp)) ans += mp[tmp];
}
}
}
cout << ans << '\n';
return 0;
}