1298 凸包周长

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 钻石 Diamond

题目描述 Description

给出平面上n个点,求出这n个点形成的凸包的周长。

凸包的定义:能覆盖住这个n个点的最小凸多边形。

输入描述 Input Description

第一行一个整数n,接下来n行,每行两个整数x和y,表示一个点的坐标。

数据范围 1 <= n <= 100000

-10000<=x,y<=10000

输出描述 Output Description

一行一个实数,表示凸包周长,保留一位小数.

样例输入 Sample Input

5

0 0

2 2

0 2

2 0

1 1

样例输出 Sample Output

8.0

数据范围及提示 Data Size & Hint



分类标签 Tags

计算几何

/*
计算几何第二题留念flag.
Jarvis O(NM)(M为凸包上的点的个数)
从最下面的一坨点找一个最左边的点.
然后以向右为基准扫描.
用叉积判断两点的位置关系.
重复上述步骤即可.
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAXN 100001
using namespace std;
int n,top;
double ans;
struct data{int x,y;}s[MAXN],a[MAXN];
bool cmp(const data &x,const data &y)
{
if(x.y!=y.y) return x.y<y.y;
return x.x<y.x;
}
bool chaji(const data &x,const data &y,const data &z)
{
return (y.x-x.x)*(z.y-x.y)>(z.x-x.x)*(y.y-x.y);
}
double slove(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y);
sort(a,a+n,cmp);
s[0]=a[0];s[1]=a[1];top=1;
for(int i=2;i<n;i++)
{
while(top&&!chaji(s[top],s[top-1],a[i])) top--;
s[++top]=a[i];
}
int l=top;
s[++top]=a[n-2];
for(int i=n-3;i>=0;i--)
{
while(top!=l&&!chaji(s[top],s[top-1],a[i])) top--;
s[++top]=a[i];
}
ans+=slove(s[0].x,s[0].y,s[top-1].x,s[top-1].y);
for(int i=0;i<top-1;i++)
ans+=slove(s[i].x,s[i].y,s[i+1].x,s[i+1].y);
printf("%.1lf",ans);
return 0;
}

最新文章

  1. mysql 日志文件mysql-bin文件清除方法,和mysql-bin相关文件的配置
  2. Winform开发框架之客户关系管理系统(CRM)的报价单和销售单的处理
  3. 小希的迷宫(MST单棵树判断法则)
  4. leetcode95 Unique Binary Search Trees II
  5. Discuz X3.2 SEO设置 title 不支持空格的解决方法
  6. ^(bitwise exclusive Or).
  7. [C#参考]Struct结构体
  8. linux--档案权限与目录配置
  9. [Android] 点击事件的四种写法
  10. SPI知识总结
  11. 【CSS】按钮的禁用与可用 CSS Cursor 属性
  12. scrapy爬虫之模拟ajax post请求获取数据
  13. jmeter测试mysql遇到的问题
  14. Python下载及Python最强大IDEPyCharm下载链接
  15. 【Codeforces Round 1110】Codeforces Global Round 1
  16. linux 中的./configuration --prefix=安装路径 的用法(指定源码安装方式的安装路基)
  17. django_rq无法监听两个队列问题
  18. 初始JSP
  19. UI5-学习篇-16-云端SCP-Destination配置
  20. 使用InstallShield打包windriver驱动-转

热门文章

  1. centos7.2 安装Lnmp
  2. python-day3(正式学习)
  3. Task资料
  4. Windows编程 Windows程序的生与死(中)
  5. MVC全局过滤器
  6. C++ STL 之 set 和 pair
  7. 【Day4】1.JsonPath使用案例
  8. web开发:javascript高级
  9. C 动态内存申请
  10. 02_Hive安装简介