http://acm.hdu.edu.cn/showproblem.php?pid=6055

【题意】

给定n个格点,问有多少个正多边形

【思路】

  • 因为是格点,只可能是正方形
  • 枚举正方形的对角线,因为有两条对角线,最后答案要/2
  • 也可以枚举正方形的边,因为有四条边,答案要/4
  • 看当前对角线确定的正方形是否存在,用几何知识求出目标点的坐标,然后二分查找目标点是否存在

【Accepted】

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include<iostream>
#include <vector>
using namespace std ;
#define eqs 1e-9
struct node
{
double x , y ;
} p[] ;
bool cmp(node a,node b)
{
return ( a.x < b.x || ( a.x == b.x && a.y < b.y ) ) ;
}
bool judge(double x,double y,int n)
{
int low = , mid , high = n- ;
while( low <= high )
{
mid = (low + high) / ;
if( fabs(p[mid].x-x) < eqs && fabs(p[mid].y-y) < eqs )
return true ;
else if( p[mid].x-x > eqs || ( fabs(p[mid].x-x) < eqs && p[mid].y-y > eqs ) )
high = mid - ;
else
low = mid + ;
}
return false ;
}
int main()
{
int n,num;
double x,xx,y,yy;
while(scanf("%d", &n)!=EOF&&n)
{
num = ;
for(int i = ; i < n ; i++)
{
cin>>p[i].x>>p[i].y;
}
sort(p,p+n,cmp) ;
for(int i = ; i < n ; i++)
{
for(int j = i+ ; j < n ; j++)
{
if( i == j ) continue ;
x = (p[i].x+p[j].x)/ ;
y = (p[i].y+p[j].y)/ ;
xx = p[i].x - x ;
yy = p[i].y - y ;
if( judge(x+yy,y-xx,n) && judge(x-yy,y+xx,n) )
{
num++ ;
}
}
}
cout<<num/<<endl;
}
return ;
}

【2017多校训练2+计算几何+板】HDU 6055 Regular polygon的更多相关文章

  1. 2017ACM暑期多校联合训练 - Team 2 1011 HDU 6055 Regular polygon (数学规律)

    题目链接 **Problem Description On a two-dimensional plane, give you n integer points. Your task is to fi ...

  2. HDU 6055 - Regular polygon | 2017 Multi-University Training Contest 2

    /* HDU 6055 - Regular polygon [ 分析,枚举 ] 题意: 给出 x,y 都在 [-100, +100] 范围内的 N 个整点,问组成的正多边形的数目是多少 N <= ...

  3. HDU 6055 Regular polygon

    Regular polygon Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  4. hdu 6055 : Regular polygon (2017 多校第二场 1011) 【计算几何】

    题目链接 有个结论: 平面坐标系上,坐标为整数的情况下,n个点组成正n边形时,只可能组成正方形. 然后根据这个结论来做. 我是先把所有点按照 x为第一关键字,y为第二关键字 排序,然后枚举向量 (p[ ...

  5. 2017 Multi-University Training Contest - Team 2 &hdu 6055 Regular polygon

    Regular polygon Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  6. HDU 6055 Regular polygon —— 2017 Multi-University Training 2

    Regular polygon Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  7. HDU 6055 Regular polygon (暴力)

    题意,二维平面上给N个整数点,问能构成多少个不同的正多边形. 析:容易得知只有正四边形可以使得所有的顶点为整数点.所以只要枚举两个点,然后去查找另外两个点就好. 代码如下: #pragma comme ...

  8. 【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge

    acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线 ...

  9. 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it

    http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...

随机推荐

  1. sleep与wait的对比

    链接:https://www.nowcoder.com/questionTerminal/eeff0fdb43034ee7b43838fb9de4519e来源:牛客网 sleep是线程类(Thread ...

  2. 在solr客户端删除库中的数据

    1.在solr客户端,访问你的索引库(我认为最方便的方法) 1)documents type 选择 XML 2)documents 输入下面语句<delete><query>* ...

  3. P2044 随机数生成器

    链接:https://www.luogu.org/problem/show?pid=2044#sub 题目描述 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linea ...

  4. 关于Control.Dispatcher.BeginInvoke卡界面

    Control.Dispatcher.BeginInvoke里的逻辑由UI线程执行,如果内部包含耗时操作就会造成界面卡住. Action.BeginInvoke里的逻辑,将在一个新开的线程中执行,而不 ...

  5. hihocoder1067 最近公共祖先·二

    思路: 使用tarjan算法,这是一种离线算法. 实现: #include <bits/stdc++.h> using namespace std; typedef pair<int ...

  6. iOS 从相册中拿到 图片名 ,截取后缀,图片名

    //从路径中获得完整的文件名 (带后缀) 对从相册中取出的图片,视频都有效. NSString *fileName = [filePath lastPathComponent]; //获得文件名 (不 ...

  7. linux系统中文件的几种类型

    Linux系统是以文件的形式来进行管理的.Linux文件类型常见的有:普通文件.目录.字符设备文件.块设备文件.符号链接文件等,如果想了解这方面知识的弟兄,就进来了解了解. Linux系统不同于win ...

  8. sql 删除重复数据

    DELETE a FROM tbBuilding a WHERE EXISTS (SELECT 1 FROM tbBuilding b WHERE b.Province = a.Province AN ...

  9. Es6里面的解析结构

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  10. mysql 表锁死的问题

    select * from information_schema.innodb_trx; kill 34863;kill 34856;kill 34860;kill 34859;kill 34845; ...