题意:
给你几个五维空间上的点,问你有几个好点,
好点定义:任意其他两个点与该点的夹角不为锐角。
思路:
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;
}