题意:给你五维空间内n个点,问你有多少个点不是坏点。
坏点定义:如果对于某个点A,存在点B,C,使得角BAC为锐角,那么A是坏点。
结论:如果n维空间内已经存在2*n+1个点,那么再往里面添加任意多个点,就会导致所有点都变成坏点。
容易看出来(?),把2*n+1个点分别放在原点处和每个坐标轴的正负半轴上各一个比较优。
所以n>11时,直接输出零,否则暴力枚举。
#include<cstdio> using namespace std; typedef long long ll; struct Point{ ll v,w,x,y,z; Point(const ll &v,const ll &w,const ll &x,const ll &y,const ll &z){ this->v=v; this->w=w; this->x=x; this->y=y; this->z=z; } Point(){} void read(){ scanf("%I64d%I64d%I64d%I64d%I64d",&v,&w,&x,&y,&z); } }p[1011]; typedef Point Vector; Vector operator - (const Point &a,const Point &b){ return Vector(a.v-b.v,a.w-b.w,a.x-b.x,a.y-b.y,a.z-b.z); } ll dot(const Vector &a,const Vector &b){ return a.x*b.x+a.y*b.y+a.z*b.z+a.v*b.v+a.w*b.w; } int n,e,anss[1011]; int main(){ // freopen("c.in","r",stdin); scanf("%d",&n); if(n>11){ puts("0"); return 0; } for(int i=1;i<=n;++i){ p[i].read(); } for(int i=1;i<=n;++i){ bool flag=1; for(int j=1;j<=n;++j){ bool f2=1; for(int k=1;k<=n;++k){ if(i!=j && j!=k){ if(dot(p[j]-p[i],p[k]-p[i])>0){ f2=0; break; } } } if(!f2){ flag=0; break; } } if(flag){ anss[++e]=i; } } printf("%d ",e); if(e){ for(int i=1;i<e;++i){ printf("%d ",anss[i]); } printf("%d ",anss[e]); } return 0; }