题意
给出NN个点的坐标,求出其中能组成几个三角形。
思路
一个三角形需要三个点组成,所以可以个点可以组成C3NCN3个三角形,但是可能有三个点在同一条线上,这就不能组成一个三角形。
我们可以换种做法:
枚举一个点,还需要22个点才能和这个点组成三角形。这种方案有个。
判断重复的情况,我们求出这些点和枚举的点的斜率,判断是不是在同一条线上,然后减去相应的方案数。
还要判断斜率不存在的情况,误差不超过1e-9。
代码
#include<cstdio>
#include<algorithm>
const double eps = 1e-9;
int n;
long long ans;
int x[3001], y[3001];
double p[3001];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d %d", &x[i], &y[i]);
for (int i = 3; i <= n; i++) {
ans += (i - 1) * (i - 2) / 2;
int t = 0;//t存斜率不存在的边个数
for (int j = 1; j < i; j++) {
if (!(x[i] - x[j])) t++;
p[j] = (double)(y[i] - y[j]) / (x[i] - x[j]);
}
std::sort(p + 1, p + i);
p[i] = 2147483647;
int k = 1;
for (int j = 2; j <= i; j++) {
if (p[j] - p[j - 1] <= eps) k++;
else {
ans -= k * (k - 1) / 2;//减去相同斜率情况
k = 1;
}
}
ans -= t * (t - 1) / 2;
}
printf("%lld", ans);
}