计算几何
训练的题目,给出n个点的坐标(整数),选3个点组成三角形问能形成多少个锐角三角形
直接暴力解决,用三个for循环枚举3个点(升序枚举避免重复),然后用余弦判断三角形中三个角是否为锐角
判断一个角为锐角:已知j,i,k三个点形成一个角,以i为交点向j,k做两个向量a,b,用余弦定理
cos = a*b/( |a| * |b| ) ,因为|a|*|b|必为正整数而且我们不是要算确切的角度只是判断锐,直,钝角所以直接用 a*b
a*b=0 , 直角
a*b>0 , 锐角或0度
a*b<0,钝角或180度
所以不用单纯靠 a*b 的正负来判断是什么叫,对于a*b>0的情况还要判断是否为0度
最后整个数据都是整型,操作也用整型不需要用浮点型,避免精度问题
#include#include #include using namespace std;#define N 110typedef long long ll;typedef pair pll;pll p[N];int n;ll judge(pll a , pll b){ ll c = a.first*b.first + a.second*b.second ; if(c<=0 || (c>0 && a.first*b.second == a.second*b.first)) return -1; return 1;}void solve(){ ll count = 0; for(int i=0; i