hdu 5533 正n边形判断 精度处理
Dancing Stars on Me
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1098 Accepted Submission(s): 598
Formally, a regular polygon is a convex polygon whose angles are all equal and all its sides have the same length. The area of a regular polygon must be nonzero. We say the stars can form a regular polygon if they are exactly the vertices of some regular polygon. To simplify the problem, we project the sky to a two-dimensional plane here, and you just need to check whether the stars can form a regular polygon in this plane.
1≤T≤300
3≤n≤100
−10000≤xi,yi≤10000
All coordinates are distinct.
3
0 0
1 1
1 0
4
0 0
0 1
1 0
1 1
5
0 0
0 1
0 2
2 2
2 0
YES
NO
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#include <set>
#define MM(a) memset(a,0,sizeof(a))
typedef long long ll;
typedef unsigned long long ULL;
const double eps = 1e-12;
const int inf = 0x3f3f3f3f;
const double pi=acos(-1);
using namespace std; struct Point{
int x,y;
void read()
{
scanf("%d%d",&x,&y);
}
}p[105],tubao[105]; int dcmp(double a)
{
if(fabs(a)<eps) return 0;
else if(a>0) return 1;
else return -1;
} Point operator-(Point a,Point b)
{
return (Point){a.x-b.x,a.y-b.y};
} double dis(Point a)
{
return sqrt(a.x*a.x+a.y*a.y);
} double cross(Point a,Point b)
{
return a.x*b.y-b.x*a.y;
} double dot(Point a,Point b)
{
return a.x*b.x+a.y*b.y;
} bool cmp(Point a,Point b)
{
if(a.x!=b.x) return a.x<b.x;
else return a.y<b.y;
} int convex_hull(Point *p,int n,Point *tubao)
{
sort(p+1,p+n+1,cmp);
int m=0;
for(int i=1;i<=n;i++)
{
while(m>=2&&cross(p[i]-tubao[m-1],tubao[m]-tubao[m-1])>0) m--;
tubao[++m]=p[i];
}
int k=m;
for(int i=n-1;i>=1;i--)
{
while(m-k>=1&&cross(p[i]-tubao[m-1],tubao[m]-tubao[m-1])>0) m--;
tubao[++m]=p[i];
}
m--;
return m;
} int main()
{
int cas,n;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++) p[i].read();
int k=convex_hull(p,n,tubao);
tubao[k+1]=tubao[1]; bool flag=true;
double tmp=(n-2.0)*pi/n; for(int i=1;i<=k-1;i++)
{
Point a=tubao[i+1]-tubao[i],b=tubao[i+2]-tubao[i+1];
double cosang=dot(a,b)/(dis(a)*dis(b));
double ang=acos(cosang);
ang=pi-ang;
if(dcmp(ang-tmp)!=0) {flag=false;break;}
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
分析:主要是借助这道题来分下下计算几何的精度问题,
double型数据精度处理的两种方式
1.相除改为ong long相乘,这种是肯定对的,不会错。
2.dcmp函数,这种比较简单,但是有一定的精度条件,如果角度是1/999999-1/1000000,那么相减起来就是1e-6*1/999999为1e-12级别,这样是可以使用dcmp的,比如本道题,因为1-e4<=x<=1e4,那么最小的角度差是1/(2*1e4-1)-1/2*1e4(最小的角是1/2*1e4,第二小的角度是1/(2*1e4-1))为1e-8级别>1e-12级别,所以可以用dcmp(eps<1e-12)
hdu 5533 正n边形判断 精度处理的更多相关文章
- HDU - 1317 ~ SPFA正权回路的判断
题意:有最多一百个房间,房间之间连通,到达另一个房间会消耗能量值或者增加能量值,求是否能从一号房间到达n号房间. 看数据,有定5个房间,下面有5行,第 iii 行代表 iii 号 房间的信息,第一个数 ...
- hdu 5533 Dancing Stars on Me
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5533 Dancing Stars on Me Time Limit: 2000/1000 MS (Ja ...
- hdu 5533 Dancing Stars on Me(数学,水)
Problem Description The sky was brushed clean by the wind and the stars were cold in a black sky. Wh ...
- HDU 5533/ 2015长春区域 G.Dancing Stars on Me 暴力
Dancing Stars on Me Problem Description The sky was brushed clean by the wind and the stars were col ...
- HDU 5533 Dancing Stars on Me( 有趣的计算几何 )
链接:传送门 题意:给出 n 个点,判断能不能构成一个正 n 边形,这 n 个点坐标是整数 思路:这道题关键就在与这 n 个点坐标是正整数!!!可以简单的分析,如果 n != 4,那一定就不能构成正 ...
- TZOJ 2392 Bounding box(正n边形三点求最小矩形覆盖面积)
描述 The Archeologists of the Current Millenium (ACM) now and then discover ancient artifacts located ...
- Android 正 N 边形圆角头像的实现
卖一下广告,欢迎大家关注我的微信公众号,扫一扫下方二维码或搜索微信号 stormjun94(徐公码字),即可关注. 目前专注于 Android 开发,主要分享 Android开发相关知识和一些相关的优 ...
- hdu 5533 Dancing Stars on Me 水题
Dancing Stars on Me Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.p ...
- HDU 3342 Legal or Not(判断是否存在环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 Legal or Not Time Limit: 2000/1000 MS (Java/Othe ...
随机推荐
- 购物车以php原生cookie实现
index.php //入口文件 <?php /** * @name index.php * @decs * @author 老猫 <18368091722@163.com> * U ...
- Java Volatile关键字(转)
出处: Java Volatile关键字 Java的volatile关键字用于标记一个变量“应当存储在主存”.更确切地说,每次读取volatile变量,都应该从主存读取,而不是从CPU缓存读取.每次 ...
- L1-025. 正整数A+B 简单复习一下,。
本题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000].稍微有点麻烦的是,输入并不保证是两个正整数. 输入格式: 输入在一行给出A和B,其间以空格分开.问题是A和B不一定是满 ...
- JavaScript内置排序方法sort实现排序操作
var arr = [10,8,6,9,1,7,2,13,5,1,9]; //sort排序 arr.sort(function(a,b){ //可以改变数组本身的排序方法 return a-b; }) ...
- vue-loading图
父组件给子组件src地址: columns(){ return [ {'title': '图片', 'key': 'img', render(h, {row}){ return h(LoadingIm ...
- javascript框架(库)
javascript框架(库)高级JavaScript编程,尤其是复杂的浏览器差异处理,通常是困难和耗时的.为了响应这些调整,出现了许多javascript(helper)库.这些JavaScript ...
- ES6 class 继承 与面向对象封装开发简单实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 常见DML语句汇总
DML操作是指对数据中表记录的操作,主要包括表记录的插入(insert).更新(update).删除(delete)和查询(select),是开发人员日常使用最频繁的操作,下面依次对它们进行介绍. ( ...
- yocto 编译C程序
1. 找到编译器位置所在(相关设置参考/opt/poky/1.7/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi文件) poky安装在 ...
- deep_learning_Function_ lambda函数详解
这里总结了关于 Python 中的 lambda 函数的“一个语法,三个特性,四个用法”. 一个语法: 在 Python 中,lambda 函数的语法是唯一的.其形式如下: lambda argume ...