您的位置:首页 > 其它

Codeforces 851C . Five Dimensional Points 计算几何,结论

2017-09-05 21:23 337 查看

题意

给定n(1000)个5维空间的点,定义坏点a为存在两个不同的点b,c使得ab与ac向量夹角为锐角.定义好点为不是坏点的点.求好点的个数与他们的下标.

解法

任意三个点组成一个三角形,其中必有两个或以上的锐角.所以当n>2时好点的个数不会超过1.当n<=2时好点个数为n.

考虑2维平面的情况,一个点是好点则它周围最多有4个点(上下左右),大于5个点的情况不可能存在好点.

扩展到五维空间,只有11个点以内才可能存在最多1个好点.枚举即可.

代码

/* LittleFall : Hello! */
#include <bits/stdc++.h>
using namespace std;
int save[1010][5];
int main(void)
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
for(int j = 0; j < 5; j++)
scanf("%d", &save[i][j]);
if(n > 11)
{
printf("0\n");
return 0;
}
if(n <= 2)
{
printf("%d\n", n );
printf("%s\n", n == 2 ? "1\n2\n" : "1\n" );
return 0;
}
int goodidx = -1;
for(int i = 0; i < n; i++)
{
int flag = 1;
for(int j = 0; j < n; j++)
{
if(j == i) continue;
for(int k = j + 1; k < n; k++)
{
if(i == k) continue;
//检测ij和ik是否成锐角
int pp = 0;
for(int x = 0; x < 5; x++)
pp += (save[j][x] - save[i][x]) * (save[k][x] - save[i][x]);
if(pp > 0)
flag = 0;
}
if(flag == 0)
break;
}
if(flag)
goodidx = i;
if(goodidx != -1)
{
printf("1\n%d\n", goodidx + 1);
return 0;
}
}
printf("0\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: