知识点:
普通的枚举暴力,
钝角三角形:*AB2+AC2<AC^2(AB,AC为短的两边,AD为长边)
锐角三角形:*AB2+AC2<AC^2(AB,AC为短的两边,AD为长边)
题目:*
题目链接
牛牛得到了一个平面,这个平面上有 n 个不重合的点,第 i 个点的坐标为 (xi,yi)(x_i,y_i)(xi,yi)。
牛牛想知道,这 n 个点形成的三角形中,总共有多少个钝角三角形。
输入描述:
第一行,一个正整数 n,表示点数。
第二行至第 n+1 行中,第 i+1 行包含两个整数 xi,yix_i,y_ixi,yi,表示第 i 个点的坐标。
保证 1≤n≤5001\leq n\leq 5001≤n≤500,−104≤xi,yi≤104-10^4\leq x_i,y_i\leq 10^4−104≤xi,yi≤104,任意两点不重合。
输出描述:
输出一行,一个整数表示答案。
示例1
输入
0 0
-1145 1
1 0
输出
1
1
注意点:一定要先判断三点不共线,即两点间的斜率不相等,其次不要用任意两边之和大于第三边(容易卡时间,编译可能超时)
菜鸡就是大于小于不分,还有就是用二维数组来枚举导致死wa 呜呜呜`
代码区:
#include<iostream>
#include<bits/stdc++.h>//排序所需头文件名
#include<math.h>//求平方函数 的头文件名
using namespace std;
long long x[1000],y[1000];//分别存放坐标x,y
long long lenth[4];
int main()
{
int n,result=0;
cin>>n;
for(int i=0;i<n;++i)
{
cin>>x[i]>>y[i];
}
//暴力枚举分别求长度并计算三角形个数
for(int i=0;i<n;++i)
{
int j=i+1;
for(;j<n;++j)
{
int k=j+1;
for(;k<n;++k)
{
//求三边长度并排序
lenth[0]=pow(x[i]-x[j],2)+pow(y[i]-y[j],2);
lenth[1]=pow(x[i]-x[k],2)+pow(y[i]-y[k],2);
lenth[2]=pow(x[j]-x[k],2)+pow(y[j]-y[k],2);
sort(lenth,lenth+3);
//long double a,b,c;
//a=sqrt(lenth[0]),b=sqrt(lenth[1]),c=sqrt(lenth[2]);//编译时间太长了 pass
//if(((a+b)>c)&&((b+c)>a)&&((a+c)>b))
long long m =x[i]*y[k]-x[j]*y[k]+x[j]*y[i];
long long m1=y[i]*x[k]-y[j]*x[k]+x[i]*y[j];
if(m!=m1)//判断是否共线
{
if(lenth[0]+lenth[1]<lenth[2])
result++;
}
}
}
}
cout<<result;
return 0;
}
`