[ABC143D] Triangles
用\(n\)个长为\(a_i\)的棍子能拼出多少种不同的三角形?
\(n \le 2\times 10^3\)
解答
注意,使用不同棍子算作不同的三角形。
最初的想法
枚举两边边长\(a\le b\),然后(用组合数)计算\(b\le c\)有多少种可能。\(O(n^2)\)
程序比较复杂。但是跑得比较快。
注意\(2000^3\)会爆int
。
更简单的想法
先将棍子按长度排序,直接枚举用了第\(i<j\)根棍子,求合法的\(k>j\)的个数。
易知,只需满足\(a_k < a_i+a_j\)即可。使用lower_bound
即可做到\(O(n^2\log n)\)的复杂度。(当然也可以\(O(n^2)\))
#include <bits/stdc++.h>
using namespace std;
int n, a[2001], ans;
int main() {
cin >> n;
for (int i = 0; i < n; ++i)
cin >> a[i];
sort(a, a+n);
for (int i = 0; i < n; ++i)
for (int j = 0; j < i; ++j)
ans += upper_bound(a, a+n, a[i]+a[j]-1)-a-i-1;
cout << ans;
}