CF851 C 暴力
给出n个5维下的点,求点a不与其它任意的b,c重合,向量ab,ac的夹角都为钝角,这样的点个数,并打印它们。
转换二维下的求角度的函数为五维的,而且由于要求角度大于90度,在二维情况下最多有4个点,也就是象限的数量,那么推导到5维就有$2^5$个象限,所以实际上只需要判断这么多个点就能退出了,并不会TLE
/** @Date : 2017-09-04 23:12:31 * @FileName: C.cpp * @Platform: Windows * @Author : Lweleth (SoungEarlf@gmail.com) * @Link : https://github.com/ * @Version : $Id$ */ #include <bits/stdc++.h> #define LL long long #define PII pair<int ,int> #define MP(x, y) make_pair((x),(y)) #define fi first #define se second #define PB(x) push_back((x)) #define MMG(x) memset((x), -1,sizeof(x)) #define MMF(x) memset((x),0,sizeof(x)) #define MMI(x) memset((x), INF, sizeof(x)) using namespace std; const int INF = 0x3f3f3f3f; const int N = 1e5+20; const double eps = 1e-8; const double Pi = acos(-1.0); //减少精度问题 int sign(double x) { if(fabs(x) < eps) return 0; if(x < 0) return x; else return x; } struct yuu { double a, b, c, d, e; yuu(){} yuu(double aa, double bb, double cc, double dd, double ee):a(aa),b(bb),c(cc),d(dd),e(ee){} yuu operator -(const yuu &y) const { //cout << y.a << y.b << y.c << y.d << y.e<<endl; return yuu(sign(y.a-a) , sign(y.b-b) , sign(y.c-c) , sign(y.d-d) , sign(y.e-e)); } double operator *(const yuu &y) { double ans = (a*y.a) + (b*y.b) + (c*y.c)+ (d*y.d) + (e*y.e); //cout << ans << endl; return sign(ans); } }; double leng(yuu x, yuu y) { if(sign(x*y) == 0) return -1; double ans = sqrt(sign(x*y)); return ans; } yuu p[1010]; int main() { int n; while(cin >> n) { for(int i = 0; i < n; i++) { double a, b, c, d, e;//double 写错int scanf("%lf%lf%lf%lf%lf",&a, &b, &c, &d, &e); p[i] = yuu(a, b, c, d, e); //cout << p[i].a << endl; } vector<int>q; for(int i = 0; i < n; i++) { int flag = 0; for(int j = 0; j < n && !flag; j++) { for(int k = j + 1; k < n; k++) { if(i == j || j == k || i == k) continue; yuu ij = p[i] - p[j]; yuu ik = p[i] - p[k]; /*if(leng(ij,ij) == -1 || leng(ik,ik) == -1) continue;*/ double agl = acos(ij * ik / (leng(ij, ij) * leng(ik, ik))); /*if(i == 1 && j == 2 && k == 3) printf("%.lf %.lf\n", leng(ij, ij) , leng(ik, ik));*/ //cout << i << j<< k<< "~"<<agl * 180.00 / Pi<< endl; if(agl * 2.00000 + eps < Pi) { flag = 1; break; } } } if(!flag) q.PB(i); } sort(q.begin(), q.end()); printf("%d\n", q.size()); for(int i = 0; i < q.size(); i++) printf("%d%s", q[i] + 1, i==q.size() - 1?"\n":" "); } return 0; }