您的位置:首页 > 其它

[CodeForces598C]Nearest vectors[精度]

2015-11-15 14:00 239 查看
题目链接:[CodeForces598C]Nearest vectors[精度]
题意分析:

给出多个有向向量,问这些向量中,哪两个构成的无定向角(即:构成的两个角中,小的那个角)最小。

解题思路:

用atan2函数把所有向量与x轴正半轴的夹角求出,排序,俩俩间比较差值即可。

注意要使用long double。

个人感受:

精度问题太恶心了! X 3

具体代码如下:

#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<string>
#define double long double // 使用long double
using namespace std;

const int MAXN = 1e5 + 111;

struct K{
double k;
int id;
bool operator < (const K& t)const
{
return k < t.k;
}
}kk[MAXN];

int main()
{
int n; scanf("%d", &n);
double pi = acos(-1);
int x, y;
for (int i = 1; i <= n; ++i)
{
scanf("%d%d", &x, &y);
kk[i].k = atan2(y , x);
kk[i].id = i;
//printf("kk[i].k = %.18lf\n", kk[i].k);
}
sort(kk + 1, kk + 1 + n);
int ans1 = kk[1].id, ans2 = kk
.id; // 最后一个和第一个要特判下
double mi = kk[1].k + 2 * pi - kk
.k;
for (int i = 1; i < n; ++i)
{
double del = kk[i + 1].k - kk[i].k;
if (del < mi)
{
mi = del;
ans1 = kk[i].id;
ans2 = kk[i + 1].id;
}
}
printf("%d %d\n", ans1, ans2);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: