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