Official

B - Making Triangle Editorial by satashun


\(N \leq 100\) なので、全ての \((i, j, k)\) の組が実際に条件を満たすかどうかを試すことができます。 三角形の成立条件は、\(3\) 辺の長さが \(a, b, c\) であるとき

  • \(a + b > c\)
  • \(b + c > a\)
  • \(c + a > b\)

を満たすことであるので、 \(L_i, L_j, L_k\) が - 全て異なること - 上述の条件を満たすこと

\(2\) つをチェックすれば、時間計算量は \(\mathrm{O}(N^3)\) でこの問題を解くことができます。

余談ですが、\(L\) を初めにソートして \(L_1 \leq L_2, \cdots, \leq L_N\) を満たすと仮定することで、三角形の条件は \(L_i + L_j > L_k\) のみをチェックすれば良いことになります。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N;
    cin >> N;
    vector<int> vec(N);
    for (int i = 0; i < N; ++i) cin >> vec[i];
    sort(vec.begin(), vec.end());

    int ans = 0;

    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < i; ++j) {
            for (int k = 0; k < j; ++k) {
                if (vec[k] != vec[j] and vec[i] != vec[j] and
                    vec[k] + vec[j] > vec[i]) {
                    ans++;
                }
            }
        }
    }

    cout << ans << endl;

    return 0;
}

posted:
last update: