给你N根长度不一样的木棍, 求这些木棍有多少种方法能凑成一个三角形用二分法做
时间: 2024-04-29 18:27:02 浏览: 204
首先,我们可以对这N根木棍进行排序,从小到大排列。然后,我们可以固定最短的两根木棍,分别为a和b(a < b),再选择第三根木棍c去尝试组成一个三角形。
因为a < b < c,所以我们可以使用二分法,从a+b到c-1的范围内查找可行的第三根木棍。如果找到一个第三根木棍d,使得a+b > d,则d可以与a和b一起组成一个三角形。
在找到可行的第三根木棍d之后,我们可以递归地将问题转化为求N-1根木棍中有多少种方法能凑成一个三角形。
最后,我们将递归求解出的结果相加,即为N根木棍有多少种方法能凑成一个三角形。
代码示例:
```
int countTriangle(vector<int>& sticks) {
sort(sticks.begin(), sticks.end());
int count = 0;
int n = sticks.size();
for (int i = 0; i < n-2; i++) {
for (int j = i+1; j < n-1; j++) {
int sum = sticks[i] + sticks[j];
int left = j + 1, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (sticks[mid] < sum) {
left = mid + 1;
} else {
right = mid - 1;
}
}
count += (right - j);
}
}
return count;
}
```
阅读全文