牛牛手里有N根木棒,分别编号为1~N,现在他从N根里想取出三根木棒,使得三根木棒构成一个三角形,你能计算出牛牛有多少种取法吗?(考虑两种取法中使用的木棒编号有一个不一样就认为是不同的取法)。
输入描述: 首先输入一个正整数N,接下来的一行共有N个正整数表示每个木棒的长度。N ≤ 50, 木棒的长度 ≤ 10000.
输出描述: 输出一个整数表示方法数。
输入例子: 5 1 2 3 4 5
输出例子: 3
先排序
排枚举三角形中较短的两条边组合,查找最长的第三条边
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
//#define debug_
int func(vector<int>& vec)
{
sort(vec.begin(), vec.end());
int n = vec.size();
vec.push_back(99999);
int count(0);
int left(0);
for (auto i = 0; i < n;++i)
{
for (auto j = i + 1; j < n;++j)
{
int sum = vec[i] + vec[j];
for (auto k = j+1; k < vec.size();++k)
{
if (vec[k]<sum)
{
count++;
}
}
}
}
return count;
}
int main()
{
int N;
vector<int> vec;
#ifdef debug_
N = 8;
int array[8]{4 ,23 ,76 ,22 ,87 ,3 ,1 ,99};
vec.insert(vec.begin(), array, array + 8);
#else
cin >>N;
vec.resize(N);
for (auto i = 0; i < N;++i)
{
cin >> vec[i];
}
#endif
cout << func(vec);
return 0;
}