【題解】SPOJ ABCDEF

題目敘述: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;
}
分享本文 Share with friends