小b有一个仅包含非负整数的数组a,她想知道有多少个三元组(i,j,k),满足i<j<k且a[i],a[j],a[k]可能作为某个三角形的三条边的边长。
输入
第一行输入一个正整数n,表示数组a中元素个数; 第二行n个非负整数,表示a中元素,以空格隔开; 其中0<n≤1000,a中任意元素a[i]满足0≤a[i]≤1000。
输出
输出一个数,表示满足题意的三元组个数
输入样例
4
2 2 3 4
输出样例
3
排序,然后枚举两个边,找满足条件的第三条边的个数。
代码:
#include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; int n; int s[1000]; int main() { scanf("%d",&n); for(int i = 0;i < n;i ++) { scanf("%d",&s[i]); } sort(s,s + n); int ans = 0; for(int i = 1;i < n - 1;i ++) { for(int j = 0;j < i;j ++) { int l = i,r = n - 1; while(l < r) { int mid = (l + r + 1) / 2; if(s[mid] >= s[i] + s[j]) r = mid - 1; else l = mid; } ans += l - i; } } printf("%d",ans); return 0; }