五维下,给出一些点,问多少个点满足:与任意其他两点连线间夹角不为锐角。
先考虑二维下:下面证明当点数超过5个时没有满足题意的点。
任取一个点(记为A1)为坐标系原点建系,假设同一象限内有>=2个点,那么从这些任取两点与圆心连线,夹角为必锐角,所以每个象限只能有一个,所以总数不能超过5个(四个象限+原点)。
类似的,在五维时也必有一个上限n,点数超过n后无解。
那么我们卡复杂度即可(若问题有解,必在要求复杂度内,所以卡在复杂度边界必定正确),设置一个n,大约三百左右即可。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,cc;
int a[2000][10];
memset(a, 0, sizeof(a));
cc = 0;
cin >> n;
for (int i = 1;i <= n;i++)
for (int j = 1;j <= 5;j++)
cin >> a[i][j];
if (n >243)cout << "0" << endl;
else
{
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= n;j++)
{
if (j == i)continue;
for (int k = j + 1;k <= n;k++)
{
long long F=(a[j][1] - a[i][1])*(a[k][1] - a[i][1]) + (a[j][2] - a[i][2])*(a[k][2] - a[i][2]) + (a[j][3] - a[i][3])*(a[k][3] - a[i][3]) + (a[j][4] - a[i][4])*(a[k][4] - a[i][4]) + (a[j][5] - a[i][5])*(a[k][5] - a[i][5]) ;
if (F> 0)
{
a[i][0] = 1;
break;
}
}
if (a[i][0] == 1)break;
}
if (a[i][0] == 0)cc++;
}
cout << cc << endl;
for (int i = 1;i <= n;i++)
if (a[i][0] == 0) cout << i << endl;
}
}