三角形(triangle)

题目描述
平面上有n个点,求出用这些点可以构成的三角形数。
输入
第一行一个整数n。

接下来n行,每行两个整数,表示点的坐标。
输出
输出仅一个整数,表示所求答案。
输入样例复制
5
0 0
1 1
1 -1
-1 -1
-1 1
输出样例复制
8
说明
Data Constraint
对于50%的数据,n<=300。
对于100%的数据,n<=3000,坐标的绝对值不超过10^4,保证没有重合的点。

.
.
.
.
.
.
分析
枚举第一个点,对于剩下的点按照和这个点连线的斜率排序一下,把相同斜率的线段放在一起,可以算出选到两条相同斜率的线段方案数,即不能构成三角形的方案数,然后统计答案。注意处理斜率不存在的情况。

.
.
.
.
.
.
程序:

#include
#include
#include
#include
using namespace std;

int x[4000],y[4000];
double b[100000];

int main()
{
     
    int n;
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%d%d",&x[i],&y[i]);
    long long s=(long long)n*(n-1)*(n-2)/(3*2*1);
    
    for (int i=1;i<=n-2;i++)
    {
     
        int l=0;
        for (int j=i+1;j<=n;j++)
            if (x[i]-x[j]!=0) b[++l]=(double)(y[i]-y[j])/(double)(x[i]-x[j]); else b[++l]=2147483647;
        sort(b+1,b+l+1);
        int t=1;
        for (int j=2;j<=l;j++)
            if (b[j-1]==b[j]) t++; else
            {
     
                s-=(long long)((t-1)*t)/2;
                t=1;
            }
        s-=(long long)((t-1)*t)/2;
    }
    printf("%lld",s);
    return 0;
}

你可能感兴趣的:(c++,数学)