codeforces851C. Five Dimensional Points(暴力/思维)

来源:互联网 发布:中国税务网络大学 加速 编辑:程序博客网 时间:2024/06/07 23:13

题意:

给你几个五维空间上的点,问你有几个好点,

好点定义:任意其他两个点与该点的夹角不为锐角。

思路:

1.只要判断为坏点后马上break,暴力能过。。(我天,,我当时没敢写,看来以后遇事不决先暴力优化一发试试)

2.只要n>11这个空间上必定没有好点,因为五维空间理论上只有5条互相垂直的直线,若一个点为好点,该空间最多只有11个点(五条垂线的交点为好点,其他的点分别在每条垂线上,即5*2+1)

两种思路均按照题意模拟即可;

两种思路跑起来均为15ms((数据好弱。。。

暴力代码:

#include <bits/stdc++.h>using namespace std;const double pi  = acos(-1.0);int arr[1001][5];int ans[1001];int main(){    int n;    cin>>n;    if(n<3)    {        for(int i = 0;i<n;i++)        {            int a;            scanf("%d%d%d%d%d%d",&a,&a,&a,&a,&a,&a);        }        printf("%d\n",n);        for(int i = 0;i<n;i++)            printf("%d\n",i+1);    }    else    {        for(int i = 0;i<n;i++)        {            for(int j = 0;j<5;j++)            {                scanf("%d",&arr[i][j]);            }        }        int len = 0;        for(int i = 0;i<n;i++)        {            int flag = 0;            for(int j = 0;j<n&&flag==0;j++)            {                if(i==j)                    continue;                for(int k = 0;k<n&&flag==0;k++)                {                    if(k==i||k==j)                        continue;                    double xy = 0,xx = 0,yy = 0;                    for(int z = 0;z<5;z++)                    {                        xx += (arr[j][z]-arr[i][z])*(arr[j][z]-arr[i][z]);                        yy += (arr[k][z]-arr[i][z])*(arr[k][z]-arr[i][z]);                        xy+=(arr[j][z]-arr[i][z])*(arr[k][z]-arr[i][z]);                    }                    double s=sqrt(xx)*sqrt(yy);                    if(acos(xy/s)>=0&&acos(xy/s)<pi/2)                    {                        flag = 1;                    }                }            }            if(!flag)            {                ans[len++] = i+1;            }        }        printf("%d\n",len);        for(int i = 0;i<len;i++)            printf("%d\n",ans[i]);    }    return 0;}

数学思维:
#include <bits/stdc++.h>using namespace std;const double pi  = acos(-1.0);int arr[11][5];int ans[11];int main(){    int n;    cin>>n;    if(n>11)    {        for(int i = 0;i<n;i++)        {            int a;            scanf("%d%d%d%d%d%d",&a,&a,&a,&a,&a,&a);        }        puts("0");    }    else if(n<3)    {        for(int i = 0;i<n;i++)        {            int a;            scanf("%d%d%d%d%d%d",&a,&a,&a,&a,&a,&a);        }        printf("%d\n",n);        for(int i = 0;i<n;i++)            printf("%d\n",i+1);    }    else    {        for(int i = 0;i<n;i++)        {            for(int j = 0;j<5;j++)            {                scanf("%d",&arr[i][j]);            }        }        int len = 0;        for(int i = 0;i<n;i++)        {            int flag = 0;            for(int j = 0;j<n&&flag==0;j++)            {                if(i==j)                    continue;                for(int k = 0;k<n&&flag==0;k++)                {                    if(k==i||k==j)                        continue;                    double xy = 0,xx = 0,yy = 0;                    for(int z = 0;z<5;z++)                    {                        xx += (arr[j][z]-arr[i][z])*(arr[j][z]-arr[i][z]);                        yy += (arr[k][z]-arr[i][z])*(arr[k][z]-arr[i][z]);                        xy+=(arr[j][z]-arr[i][z])*(arr[k][z]-arr[i][z]);                    }                    double s=sqrt(xx)*sqrt(yy);                    if(acos(xy/s)>=0&&acos(xy/s)<pi/2)                    {                        flag = 1;                    }                }            }            if(!flag)            {                ans[len++] = i+1;            }        }        printf("%d\n",len);        for(int i = 0;i<len;i++)            printf("%d\n",ans[i]);    }    return 0;}



阅读全文
1 0