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

来源:互联网 发布:倚天象棋软件 编辑:程序博客网 时间:2024/06/11 01:59

题意

给定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;}
阅读全文
0 0
原创粉丝点击