UVALive 6859 Points (凸包)
Points
题目链接:
http://acm.hust.edu.cn/vjudge/contest/130303#problem/E
Description
http://7xjob4.com1.z0.glb.clouddn.com/4c9abc79e61f4d543441b48cb0cf6bbe
Input
The input file contains several test cases, each of them as described below.
The first line contains integer N — the number of points placed by Peter (1 ≤ N ≤ 100000). Each of
following N lines contains two integers xi , yi — the point coordinates placed by Peter. The coordinates by absolute value do not exceed 10^6 . Some points can match.
Output
For each test case, you need to print one number — the perimeter of the required polygon, on a line
by itself. The answer should be printed with accuracy not less than 0.001.
Sample Input
```
1
0 0
2
1 1
1 2
```
Sample Output
```
5.656
7.656854
```
Source
2016-HUST-线下组队赛-4
##题意:
给出网格上的n个点,求一个周长最小的多边形使得所有点都在其内部,且多边形的边要么是网格的边,要么是网格的对角线.
##题解:
由于边只能是网格边或者对角线,在纸上画一下三角形时的情况即可推出结果轮廓.
先对所有点求一个凸包,然后把凸包拓展成为由网格边或对角线组成的多边形,再整体往外扩大1即是最后的结果.
##代码:
``` cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define maxn 111000
#define inf 0x3f3f3f3f
#define mod 1000000007
#define mid(a,b) ((a+b)>>1)
#define eps 1e-8
#define IN freopen("in.txt","r",stdin);
using namespace std;
int n;
struct Point{
LL x,y;
Point() {}
Point(LL tx, LL ty) {x=tx;y=ty;}
}p[maxn];
LL xmul(Point p0, Point p1, Point p2) {
return (p1.x-p0.x)(p2.y-p0.y) - (p2.x-p0.x)(p1.y-p0.y);
}
LL Dis(Point p1, Point p2) {
return (p1.x-p2.x)(p1.x-p2.x) + (p1.y-p2.y)(p1.y-p2.y);
}
int s[maxn], top;
int cmp_polar(Point p1, Point p2) {
LL tmp = xmul(p[0], p1, p2);
if(tmp > 0) return 1;
else if(tmp==0 && (Dis(p[0],p1)-Dis(p[0],p2))<0) return 1;
else return 0;
}
void polar(int n) {
int pos = 0;
Point p0 = p[0];
for(int i=1; i<n; i++) {
if(p0.y>p[i].y || (p0.y==p[i].y && p0.x>p[i].x)) {
p0 = p[i];
pos = i;
}
}
p[pos] = p[0];
p[0] = p0;
sort(p+1, p+n, cmp_polar);
}
void Gramham(int n) {
polar(n);
top = 0;
for(int i=0; i<n; i++) {
while(top>1 && xmul(p[s[top-2]],p[s[top-1]],p[i])<=0) top--;
s[top++] = i;
}
}
int main()
{
//IN;
while (scanf("%d", &n) != EOF)
{
for(int i=0; i<n; i++) {
scanf("%I64d %I64d", &p[i].x, &p[i].y);
}
Gramham(n);
LL ans1 = 0, ans2 = 0;
for(int i=0; i<top; i++) {
Point p1, p2;
p1 = p[s[i]];
if(i<top-1) p2 = p[s[i+1]];
else p2 = p[s[0]];
LL dx = abs(p1.x - p2.x);
LL dy = abs(p1.y - p2.y);
ans1 += abs(dx - dy);
ans2 += min(dx, dy);
}
ans2 += 4;
double ans = 1.0*ans1 + sqrt(2.0)*(double)ans2;
printf("%f\n", ans);
}
return 0;
}
UVALive 6859 Points (凸包)的更多相关文章
- UVaLive 6859 Points (几何,凸包)
题意:给定 n 个点,让你用最长的周长把它们严格包围起来,边长只能用小格子边长或者是小格子对角线. 析:先把每个点的上下左右都放到一个集合中,然后求出一个凸包,然后先边长转成题目的方式,也好转两个点的 ...
- UVALive 6859——凸包&&周长
题目 链接 题意:在一个网格图上,给出$n$个点的坐标,用一个多边形包围这些点(不能接触,且多边形的边只能是对角线或直线),求多边形的最小周长. 分析 对于每个点,我们考虑与之相邻的4个点.一共由 $ ...
- Soj题目分类
-----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...
- zbar解析二维码demo
开发环境;ubuntu 18.04 IDE:clion 2019 源文件.cpp #include <opencv2/opencv.hpp> #include <zbar.h> ...
- UVALive 4639 && SPOJ SPOINTS && POJ 3805 && AOJ 1298 Separate Points 求两个凸包是否相交 难度:3
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- UVALive 7281 Saint John Festival (凸包+O(logn)判断点在凸多边形内)
Saint John Festival 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/J Description Porto's ...
- POJ 3805 Separate Points (判断凸包相交)
题目链接:POJ 3805 Problem Description Numbers of black and white points are placed on a plane. Let's ima ...
- UVALive 2453 Wall (凸包)
题意:给你一个多边形的城堡(多个点),使用最短周长的城墙将这个城堡围起来并保证城墙的每个点到城堡上的每个点的距离都不小于l 题解:因为两点间的直线一定比折线短,所以这样做 先使用所有点求得一个凸包,接 ...
- UVALive 3890 Most Distant Point from the Sea(凸包最大内接园)
一个n个点的凸多边形,求多边形中离多边形边界最远的距离.实际上就是求凸包最大内接圆的半径. 利用半平面交求解,每次二分枚举半径d,然后将凸包每条边所代表的半平面沿其垂直单位法向量平移d,看所有平移后的 ...
随机推荐
- 大二 Java上学期总结
一学期的Java学习结束了,这学期对程序语言的理解更深了,首先感谢李津老师的教导,这学期收获挺多的,不像上学期,这学期没有任何缺课表现,希望之后的语言程序学习会更加努力. 突然感觉Java的学习如此之 ...
- C语言I-2019博客作业02
这个作业属于哪个课程 C语言程序设计I 这个作业要求在哪里 C语言I-2019秋作业02 我在这个课程的目标是 学会编程及提问的技能 这个作业在哪个具体目标方面帮助我实现目标 深入了解C语言程序设计中 ...
- RocketMQ事务性消息及持久化
TransactionProducer(事务消息): 在分布式系统中,我们时常会遇到分布式事务的问题,除了常规的解决方案之外,我们还可以利用RocketMQ的事务性消息来解决分布式事务的问题.Rock ...
- 全新一台node节点加入到集群中
目录 前言 对新节点做解析 方法一 hosts 文件解析 方法二 bind 解析 测试 分发密钥对 推送 CA 证书 flanneld 部署 推送flanneld二进制命令 推送flanneld秘钥 ...
- Kibana 基本操作
es中的索引对应mysql的数据库.类型对应mysql的表.文档对应mysql的记录.映射对应mysql的索引索引:index类型:type映射:mappings 1.创建索引在kibana的Dev ...
- 利用webSocket实现浏览器中多个标签页之间的通信
webSoket用来实现双向通信,客户端和服务端实时通信. webSoket优点和缺点? 优点:对于前端来说,使用简单,功能灵活,如果部署了webSocket服务器,可以实现实时通信. 缺点:需要服务 ...
- java程序员究竟应该掌握点什么
JAVA程序设计(基础部分) JAVA程序设计(专题)
- Django基础命令
创建工程 django-admin startproject 项目名创建应用 django-admin startapp 应用名 生成迁移 python3 manage.py makemigratio ...
- Andronov-Hopf bifurcation
地址:http://www.scholarpedia.org/article/Andronov-Hopf_bifurcation Andronov-Hopf bifurcation is the bi ...
- [lean scala]|How to create a SBT project with Intellij IDEA
this article show you how to create a SBT project with IDEA. prerequisite: 1.JDK8 2.Scala 2.11.8 3.I ...