这道题真的是做吐了。因为前不久我就学了极角排序。所以这题就打算用极角排序。
之后在写完之后出了一个我发现不了的bug(气死个人
之后就一直死磕这道题。然后我找了2个小时。还是没找到。我吐了。之后就只能很不要脸的求助大佬。
之后大佬发出了灵魂质问:这个不是最大的边的平方大于剩余两边的平方和之后特判三点共线就好了吗? (大佬再多羞辱我一点XD
我直接就高潮了。随后就秒了这道题。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 500 + 5; struct node { double x,y; } p[maxn]; int n; double a[5]; double num(int x,int y) { return (p[x].x - p[y].x) * (p[x].x - p[y].x) + (p[x].y - p[y].y) * (p[x].y - p[y].y) ; } int main() { cin >> n; for(int i = 1; i <= n; i ++) cin >> p[i].x >> p[i].y; ll res = 0; for(int i = 1; i <= n; i ++) { for(int j = i + 1; j <= n; j ++) { for(int k = j + 1; k <= n; k ++) { //特判三点共线 if((p[k].y - p[i].y) * (p[j].x-p[i].x) - (p[j].y-p[i].y)*(p[k].x-p[i].x) == 0) continue; a[0] = num(i,j),a[1] = num(i,k),a[2] = num(j,k); sort(a,a + 3); if(a[0] + a[1] < a[2]) res ++; } } } cout << res << endl; return 0; }