[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;
}
题意分析:
给出多个有向向量,问这些向量中,哪两个构成的无定向角(即:构成的两个角中,小的那个角)最小。
解题思路:
用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;
}
相关文章推荐
- 前端工程化知识要点回顾&思考
- 【栈,队列】两栈实现队列
- VVDocumenter Xcode7 安装
- 【MySQL学习】Unknown column 'PASSWORD'|Access denied for user 'root'@'localhost'
- 操作系统9-进程和系统调度(II)
- 【最佳实践系列】基于序列化技术的XML数据源操作模式
- Swing中弹出对话框的几种方式_JOptionPane.showMessageDialog等详解
- 基于git hooks的前端代码质量控制解决方案
- 60. MySQLi 扩展拾遗
- postman、postman-rest client 安装
- 【NOIP2015】跳石头 (二分+贪心判定)
- React Flux架构简介
- float
- 【NOIP2015】跳石头 (二分+贪心判定)
- 函数调用和赋值运算
- 一个超级简单MiniBrowser
- jsp Request获取url信息的各种方法比较
- 看懂UML类图和时序图
- C++11新标准:decltype关键字
- JavaScript学习手记2