[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;
}

posted on 2025-07-11 15:50  itdef  阅读(6)  评论(0)    收藏  举报

导航