[R3D]拼三角形
// 16. [R3D]拼三角形.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
[R3D]拼三角形
原题地址:https://bs.daimayuan.top/p/16
题目描述
给定 n 根编号不同的小木棒的长度 leni,从中选出三根搭成一个面积大于 0 的三角形,求有多少种方案。
输入格式
第一行包含一个整数 n,表示木棍数量。
第二行包含 n 个正整数 leni,表示每根木棍的长度。
输出格式
输出一个整数,表示能搭成面积大于 0 的三角形的方案数量。
样例输入
7
4 1 5 4 1 1 4
样例输出
14
数据范围与提示
对于 30% 的数据,3 <= n <= 200。
对于 50% 的数据,3 <= n <= 3000。
另有 20% 的数据,leni <= 10^6。
对于 100% 的数据,3 <= n <= 10^4,1 <= leni <= 10^9。
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//遍历两次得到两条边,然后二分查找第三条边 时间复杂度稍稍超标 O(n^2 log n)
//然后遍历得到最大边, 使用双指针来获取两条边的上限和下限
const int N = 10010;
long long a[N];
int n;
int main() {
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);
long long ans = 0;
for (int i = n - 1; i >= 0; i--) {
int v = a[i];
int l = 0; int r = i - 1;
while (l < r) {
if (l >= r || l == i || r == i) break;;
if (a[l] + a[r] > v) {
ans += (r - l);
r--;
}
else {
l++;
}
}
}
cout << ans << endl;
return 0;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
浙公网安备 33010602011771号