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 (凸包)的更多相关文章

  1. UVaLive 6859 Points (几何,凸包)

    题意:给定 n 个点,让你用最长的周长把它们严格包围起来,边长只能用小格子边长或者是小格子对角线. 析:先把每个点的上下左右都放到一个集合中,然后求出一个凸包,然后先边长转成题目的方式,也好转两个点的 ...

  2. UVALive 6859——凸包&&周长

    题目 链接 题意:在一个网格图上,给出$n$个点的坐标,用一个多边形包围这些点(不能接触,且多边形的边只能是对角线或直线),求多边形的最小周长. 分析 对于每个点,我们考虑与之相邻的4个点.一共由 $ ...

  3. Soj题目分类

    -----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...

  4. zbar解析二维码demo

    开发环境;ubuntu 18.04 IDE:clion 2019 源文件.cpp #include <opencv2/opencv.hpp> #include <zbar.h> ...

  5. 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 ...

  6. UVALive 7281 Saint John Festival (凸包+O(logn)判断点在凸多边形内)

    Saint John Festival 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/J Description Porto's ...

  7. POJ 3805 Separate Points (判断凸包相交)

    题目链接:POJ 3805 Problem Description Numbers of black and white points are placed on a plane. Let's ima ...

  8. UVALive 2453 Wall (凸包)

    题意:给你一个多边形的城堡(多个点),使用最短周长的城墙将这个城堡围起来并保证城墙的每个点到城堡上的每个点的距离都不小于l 题解:因为两点间的直线一定比折线短,所以这样做 先使用所有点求得一个凸包,接 ...

  9. UVALive 3890 Most Distant Point from the Sea(凸包最大内接园)

    一个n个点的凸多边形,求多边形中离多边形边界最远的距离.实际上就是求凸包最大内接圆的半径. 利用半平面交求解,每次二分枚举半径d,然后将凸包每条边所代表的半平面沿其垂直单位法向量平移d,看所有平移后的 ...

随机推荐

  1. 手把手教你SOAP访问webservice并DOM解析返回的XML数据(转)

    http://blog.csdn.net/u012534831/article/details/51357111 前言: 目前我们项目组还在采用webservice这种http方式,并且某些网站服务提 ...

  2. 红帽学习笔记[RHCSA] 第九课[文件归档、硬盘、分区以及自动挂载、Swap、链接]

    文件归档 tar是什么 通过tar命令可以将大型文件汇集成一个文件(归档),注意没有压缩功能. 压缩方式 gzip 通过gzip过滤文档,使用最广泛 bzip2 通常比gzip压缩小,但是不如gzip ...

  3. 初识HTML标签

    web概念概述 JavaWeb: 使用Java语言开发基于互联网的项目 软件架构: C/S: Client/Server 客户端/服务器端 在用户本地有一个客户端程序,在远程有一个服务器端程序 如:Q ...

  4. 浅拷贝&深拷贝

    浅拷贝新的对象指向原来对象的地址 深拷贝新的对象中,原来是可变对象,会新复制一份值指向新的地址[11,22,33]若原来的对象里含有可变对象,里面的这个可变对象也会指向新的地址['qwer', 123 ...

  5. Linux文件与目录操作 ls 命令(2)

    说文件操作是最频繁地操作也不为过,在Linux中,使用ls命令可以列出当前目录中所有内容,本篇就先说说ls命令.本文所说的文件指文件和目录. ls命令常用选项 -a:显示指定目录下所有子目录与文件,包 ...

  6. Nginx 2.安装与部署配置

    转 https://www.cnblogs.com/wcwnina/p/8728430.html > 下载 官方网站:https://nginx.org/en/download.html Win ...

  7. qt 获取磁盘空间大小,cpu利用率,内存使用率

    转自:http://www.qtcn.org/bbs/read-htm-tid-60613.html. 1:封装成一个类,直接调用即可.已经在多个商业项目中使用.2:所有功能全平台 win linux ...

  8. Enlarge GCD(素数筛)

    题意 删去最少的数,使gcd变大 题解 只要保留相同素数因子最多的数即可. 素数筛. C++代码 #include<bits/stdc++.h> using namespace std; ...

  9. luogu P1232 [NOI2013]树的计数

    传送门 这题妙蛙 首先考虑构造出一个合法的树.先重新编号,把bfs序整成\(1,2,3...n\),然后bfs序就是按照从上到下从左往右的遍历顺序,所以可以考虑对bfs序分层,可以知道分层方式只会对应 ...

  10. Hive导入导出数据的方法

    Hive导入数据的方式 官网文档: LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (p ...