题意:给你几条边,问你这些边可以组成多少三角形?
和这道题http://acm.hdu.edu.cn/showproblem.php?pid=4609几乎完全一样,本题数据太水哦
本题数据很水,所以可以直接排序后三重循环,排序可以减少枚举次数,即只需要判断两个较小的边之和是否是小于较大边。更高效的方法是排序后只枚举前两条较小边,对第三边进行二分查找。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int N;
vector<int> L;
int main() {
cin >> N;
for (int i = 0; i < N; i++) {
int l;
cin >> l;
L.push_back(l);
}
sort(L.begin(), L.end());
ll ans = 0;
for (int s = 0; s < N-2; s++) {
for (int m = s+1; m < N-1; m++) {
auto itr = lower_bound(L.begin(), L.end(), L[s] + L[m]);//1 2 3 4
//cout<<*itr<<" ";
ll dis = distance(itr, L.end());
//cout<<dis<<" ";
ans += (N - 1 - m) - dis;
//cout<<(N - 1 - m) - dis<<" ";
}
}
cout << ans << endl;
return 0;
}