题目链接

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

题意:给出一个凸包,求出与凸包距离 L的外圈周长

凸包模板题,练练Andrew算法
求出凸包周长再加上半径为l的圆的周长

 #include<bits/stdc++.h>
#define N 1050
using namespace std;
int n,l,m;
const double pi=acos(-);
struct P{
int x,y;
bool operator < (const P &b)const{
return x==b.x?y<b.y:x<b.x;
}
P operator - (const P &b)const{
return (P){x-b.x,y-b.y};
}
}a[N],s[N];
double dis(P a,P b){
return sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y));
}
int crs(P a,P b){return a.x*b.y-a.y*b.x;}
void getbag(){
m=;sort(a+,a++n);
for(int i=;i<=n;i++){
while(m>&&crs(a[i]-s[m-],s[m]-s[m-])>=)m--;
s[++m]=a[i];
}
int now=m;
for(int i=n-;i>=;i--){
while(m>now&&crs(a[i]-s[m-],s[m]-s[m-])>=)m--;
s[++m]=a[i];
}
if(n>)m--;
} int main(){
int cas;scanf("%d",&cas);
while(cas--){
scanf("%d%d",&n,&l);
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
getbag();
double ans=;
for(int i=;i<m;i++)
ans+=dis(s[i],s[i+]);
ans+=dis(s[],s[m]);
ans+=*pi*l;
printf("%.0lf\n",ans);
if(cas)puts("");
}
return ;
}

最新文章

  1. Java日志规范
  2. FPGA书籍
  3. Spring-Context之八:一些依赖注入的小技巧
  4. 详解MySQL的用户密码过期功能
  5. Linux 下安装pip
  6. hive 使用笔记(partition; HDFS乱码)
  7. 抽象类Abstract的简单使用
  8. chrome你这是入侵OSX了么?
  9. Java static 关键字详解
  10. [javascript 实践篇]——那些你不知道的“奇淫巧技”
  11. Android UsageStatsService(应用使用统计服务)的学习与调研
  12. Jmeter简单介绍与搭配Jenkins实现自动化
  13. scrapy爬取数据保存csv、mysql、mongodb、json
  14. python学习笔记-调用接口
  15. mac中:不能完成此操作,因为找不到一个或多个需要的项目。(错误代码 -43)
  16. MyBatis:参数传递 [转]
  17. 1.ROS启动小乌龟
  18. 我的第一个个人博客网站 -&gt; wizzie.top
  19. 在Asp.Net中操作PDF – iTextSharp - 操作图片
  20. php7安装redis拓展

热门文章

  1. 第八条:覆盖equals时请遵守通用约定
  2. 《高级软件测试》Windows平台Jira的配置
  3. ResNet
  4. axios封装
  5. 13-TypeScript单例模式
  6. crlf注入攻击
  7. Appium+python测试app实例
  8. angular2 学习笔记 ( app initialize 初始化 )
  9. 新概念英语(1-32)A fine day
  10. 转:NLP+句法结构(三)︱中文句法结构(CIPS2016、依存句法、文法)