链接:https://ac.nowcoder.com/acm/contest/3003/D
来源:牛客网
题目描述
牛牛得到了一个平面,这个平面上有 n 个不重合的点,第 i 个点的坐标为 (xi,yi)(x_i,y_i)(xi,yi)。
牛牛想知道,这 n 个点形成的三角形中,总共有多少个钝角三角形。
输入描述:
第一行,一个正整数 n,表示点数。
第二行至第 n+1 行中,第 i+1 行包含两个整数 xi,yi,表示第 i 个点的坐标。
保证 1≤n≤500,−104≤xi,yi≤104,任意两点不重合。
输出描述:
输出一行,一个整数表示答案。
输入
3 0 0 -1145 1 1 0
输出
1
一个三角形的三边长 a,b,c( c 最长 )满足 a2+b2<c2(或存在两条边向量的点积 <0 ),则该三角形为钝角三角形。
枚举三个点判断即可,注意判断共线和不要算重。可用两边之和大于第三边判断是否为三角形。
时间复杂度 O(n^3) 。
1 #include <stdio.h>
2 #include <string.h>
3 #include <iostream>
4 #include <string>
5 #include <math.h>
6 #include <algorithm>
7 #include <vector>
8 #include <stack>
9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <sstream>
13 const int INF=0x3f3f3f3f;
14 typedef long long LL;
15 const int mod=1e9+7;
16 const double eps =1e-8;
17 const int maxn=1e4+10;
18 using namespace std;
19
20 struct node
21 {
22 LL x,y;
23 }PT[505];
24
25 LL pointDistance( LL x1, LL y1, LL x2, LL y2)//返回两点距离的平方
26 {
27 LL distance = (y1-y2)*(y1-y2) + (x1-x2)*(x1-x2);
28 return distance;
29 }
30
31 int main()
32 {
33 #ifdef DEBUG
34 freopen("sample.txt","r",stdin);
35 #endif
36
37 int n;
38 scanf("%d",&n);
39 for(int i=1;i<=n;i++)
40 scanf("%lld %lld",&PT[i].x,&PT[i].y);
41 int num=0;
42 for(int i=1;i<=n;i++)
43 {
44 for(int j=i+1;j<=n;j++)
45 {
46 for(int k=j+1;k<=n;k++)
47 {
48 LL dis[3]={0};
49 dis[0]=pointDistance(PT[i].x,PT[i].y,PT[j].x,PT[j].y);
50 dis[1]=pointDistance(PT[i].x,PT[i].y,PT[k].x,PT[k].y);
51 dis[2]=pointDistance(PT[j].x,PT[j].y,PT[k].x,PT[k].y);
52 sort(dis,dis+3);
53 if(sqrt(dis[2])==sqrt(dis[0])+sqrt(dis[1]) ) continue;//共线,不为三角形
54 if(dis[2] > dis[0]+dis[1]) num++;
55 }
56 }
57 }
58 printf("%d\n",num);
59
60 return 0;
61 }
-
来源:https://www.cnblogs.com/jiamian/p/12271695.html