题意:给你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; }