【推导】【暴力】Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) C. Five Dimensional Points

题意:给你五维空间内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\n",e);
	if(e){
		for(int i=1;i<e;++i){
			printf("%d ",anss[i]);
		}
		printf("%d\n",anss[e]);
	}
	return 0;
}
posted @ 2017-09-05 13:18  AutSky_JadeK  阅读(147)  评论(0编辑  收藏  举报
TVアニメ「Charlotte(シャーロット)」公式サイト TVアニメ「Charlotte(シャーロット)」公式サイト