题意:给你n个向量, 求夹角最小的两个向量。
直接模拟肯定会超时, 首先对对每一个向量求其对x轴正方向的角度。
然后求其差最小的。但是还是会超时。
可以对其先排序然后求差(后一项减前一项),不要忘了还有第一项减最后一项。
对于一个题目,先要推一推找规律,不要轻易放弃。
///用long double , double会WA
#include
#include
#include
#include
#include
using namespace std;
const int N = 100001;
struct node
{
long double val;
int x;
}a[N];
bool cm(node a, node b)
{
return a.val < b.val;
}
const long double pi = 3.1415926535897932384626433832795028841971;
int main(void)
{
int n, i, j;
scanf("%d", &n);
for(i = 0; i < n; i++)
{
double x, y;
scanf("%lf%lf", &x, &y);
a[i].val = atan2(x, y);
a[i].val += pi;
a[i].x = i+1;
// printf("i=%d %lf\n", i, a[i].val);
}
sort(a, a+n, cm);
node x = a[0], y = a[1];
for(i = 1; i < n-1; i++)
{
if(a[i+1].val - a[i].val < y.val - x.val)
{
x = a[i];
y = a[i+1];
}
}
if(a[0].val+pi*2 - a[n-1].val < y.val - x.val)
{
x = a[0];
y = a[n-1];
}
printf("%d %d\n", x.x, y.x);
return 0;
}

本文探讨了如何在给定平面内的一组起始于原点的向量中,找出夹角最小的两个向量。通过计算每个向量与x轴正方向的角度,并比较这些角度差值,我们可以找到满足条件的向量对。注意,非定向角度在0到π之间,考虑顺时针和逆时针方向的最小差值。输入包括向量数量和坐标,输出为夹角最小的两个向量的索引。

1314

被折叠的 条评论
为什么被折叠?



