给你n个五维的点,找到一些这样的点,这个点和任意两个不同的点连线都可以形成直角或者钝角。做题的时候理解错题意了,当成只要有两个点能和他连成直角或钝角就符合条件了。
数量积判断夹角,暴力就好了。
还可以像标程那样,超出某个范围就是0,小范围内暴力。比如二维平面顶多只能由五个点,再多就没有合法的点了。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 1010;
int n;
struct Point
{
Point(){}
Point(LL _a, LL _b, LL _c, LL _d, LL _e)
:a(_a),b(_b),c(_c),d(_d),e(_e){}
LL a,b,c,d,e;
};
Point ps[MAXN];
vector<int> res;
bool check(int i, int j, int k)
{
Point a(ps[j].a-ps[i].a,ps[j].b-ps[i].b,ps[j].c-ps[i].c,ps[j].d-ps[i].d,ps[j].e-ps[i].e);
Point b(ps[k].a-ps[i].a,ps[k].b-ps[i].b,ps[k].c-ps[i].c,ps[k].d-ps[i].d,ps[k].e-ps[i].e);
int ret = a.a*b.a + a.b*b.b + a.c*b.c + a.d*b.d + a.e*b.e;
return ret <= 0;
}
int main()
{
scanf("%d",&n);
for(int i = 0; i < n; ++i)
scanf("%d %d %d %d %d",&ps[i].a,&ps[i].b,&ps[i].c,&ps[i].d,&ps[i].e);
for(int i = 0; i < n; ++i)
{
bool f = false;
for(int j = 0; j < n; ++j)
{
if(i == j) continue;
for(int k = 0; k < n; ++k)
{
if(k == j || k == i) continue;
if(check(i,j,k) == false)
{
f = true;
break;
}
}
if(f) break;
}
if(!f) res.push_back(i+1);
}
cout << res.size() << endl;
for(int x:res)
cout << x << " ";
cout << endl;
return 0;
}