[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;
}
上一篇:干货 | 10分钟教你用branch and bound(分支定界)算法求解TSP旅行商问题


下一篇:树状数组&pair&离散化