题目链接:戳我

凸包模板

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 100010
using namespace std;
int n,top;
double ans;
struct Node{int x,y;}t[MAXN],s[MAXN];
inline bool cmp(struct Node a,struct Node b)
{
double A=atan2((a.y-t[1].y),(a.x-t[1].x));
double B=atan2((b.y-t[1].y),(b.x-t[1].x));
if(A!=B) return A<B;
else return a.x<b.x;
}
inline double cross(Node a,Node b,Node c){return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);}
inline void solve()
{
t[0]=(Node){0x3f3f3f3f,0x3f3f3f3f};
int k=0;
for(int i=1;i<=n;i++)
if(t[i].y<t[0].y||(t[i].y==t[0].y&&t[i].x<t[0].x))
t[0]=t[i],k=i;
swap(t[1],t[k]);
sort(&t[2],&t[1+n],cmp);
s[0]=t[1],s[1]=t[2];
top=1;
for(int i=3;i<=n;i++)
{
while(top&&cross(s[top-1],t[i],s[top])>=0.0) top--;
s[++top]=t[i];
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
for(;;)
{
ans=0.0;
scanf("%d",&n);
if(!n) break;
for(int i=1;i<=n;i++)
scanf("%d%d",&t[i].x,&t[i].y);
solve();
if(top==0)
ans=0;
else if(top==1)
ans=sqrt((s[0].x-s[1].x)*(s[0].x-s[1].x)+(s[0].y-s[1].y)*(s[0].y-s[1].y));
else
{
s[++top]=s[0];
for(int i=0;i<top;i++)
{
Node a=s[i],b=s[i+1];
ans+=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
}
printf("%.2lf\n",ans);
}
return 0;
}

最新文章

  1. MSBuild 编译 C# Solution
  2. CSS系列:CSS中盒子模型
  3. Spring JdbcTemplate 方法详解
  4. iOS-- 重要的链接
  5. JavaScript 语句 数组与冒泡排序法
  6. SQL 数据类型,增删改查语句
  7. Delphi 串口通信数据位长度对传输数据的影响 转
  8. trigger 触发器
  9. js用for循环为对象添加事件并传递参数
  10. Sass入门——简介+语法格式及编译调试
  11. 网页制作之html基础学习6-CSS浏览器兼容问题
  12. PHP - 目录与文件
  13. 解决TXT乱码问题
  14. [UWP小白日记-14]正则表达式
  15. 浅谈sql优化
  16. sql操作一般函数
  17. 201521123117 《Java程序设计》第10周学习总结
  18. centos 使用 beyond compare 对比工具
  19. ubuntu1604安装谷歌游览器
  20. react组件选项卡demo

热门文章

  1. MySQL用变量的方法添加伪序号列(自增序列)
  2. visjs使用小记-1.创建一个简单的网络拓扑图
  3. DEV上肤
  4. java web 读取配置文件两种方法
  5. Linux实战教学笔记15:磁盘原理
  6. DVI与VGA有什么区别
  7. Excel VBA入门(四)流程控制2-循环控制
  8. 【BZOJ3227】串【广义后缀自动机】
  9. 【UVALive2965】Jurassic Remains
  10. 124. Binary Tree Maximum Path Sum (Tree; DFS)