Convex Fence
Convex Fence
I have a land consisting of n trees. Since the trees are favorites to cows, I have a big problem saving them. So, I have planned to make a fence around the trees. I want the fence to be convex (curves are allowed) and the minimum distance from any tree to the fence is at least d units. And definitely I want a single big fence that covers all trees.
You are given all the information of the trees, to be specific, the land is shown as a 2D plane and the trees are plotted as 2D points. You have to find the perimeter of the fence that I need to create as described above. And you have to minimize the perimeter.


One tree, a circular fence is needed Two trees, the fence is shown
Input starts with an integer T (≤ 10), denoting the number of test cases.
Each case starts with a line containing two integers n (1 ≤ n ≤ 50000), d (1 ≤ d ≤ 1000). Each of the next lines contains two integers xi yi (-108 ≤ xi, yi ≤ 108) denoting a position of a tree. You can assume that all the positions are distinct.
Output
For each case, print the case number and the minimum possible perimeter of the fence. Errors less than 10-3 will be ignored.
Sample Input
3
1 2
0 0
2 1
0 -1
0 2
3 5
0 0
5 0
0 5
Sample Output
Case 1: 12.566370614
Case 2: 12.2831853
Case 3: 48.4869943478
Hint
Dataset is huge, use faster i/o methods.
题目就是说,给定几个点,要用围栏围住所有点,且围栏与每个点的距离不小于D.
样例太水,再举几个例子:

多画几个图,你很快就会发现,所求答案就是原图凸包的周长+以D为半径的园的周长,水一水就过了.
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define LL long long
#define PI (acos(-1.0))
using namespace std;
int n,top; double R;
],ch[];
point operator - (point u,point v){point ret; ret.x=u.x-v.x,ret.y=u.y-v.y; return ret;}
double dis(point u,point v){return sqrt((u.x-v.x)*(u.x-v.x)+(u.y-v.y)*(u.y-v.y));}
LL cross(point u,point v){return u.x*v.y-v.x*u.y;}
inline int read(){
,f=; char ch=getchar();
'){if (ch=='-') f=-f; ch=getchar();}
+ch-',ch=getchar();
return x*f;
}
bool cmp(const point &u,const point &v){
],v-a[])>||cross(u-a[],v-a[])==&&dis(u,a[])<dis(v,a[]);
}
void Out_(){
;
){
; i<top; i++) ans+=dis(ch[i],ch[i+]);
ans+=dis(ch[top],ch[]);
}
ans+=PI*R*;
printf("%.7lf\n",ans);
}
void Graham(){
;
; i<=n; i++) if (a[i].y<a[now].y||a[i].y==a[now].y&&a[i].x<a[now].x) now=i;
swap(a[now],a[]);
sort(a+,a++n,cmp);
ch[]=a[],ch[]=a[],ch[]=a[],top=;
; i<=n; i++){
],ch[top]-ch[top-])>) top--;
ch[++top]=a[i];
}
}
int main(){
; Ts<=T; Ts++){
scanf(,,sizeof ch);
; i<=n; i++) a[i].x=read(),a[i].y=read();
printf("Case %d: ",Ts);
Graham(),Out_();
}
;
}
Convex Fence的更多相关文章
- LightOJ 1239 - Convex Fence 凸包周长
LINK 题意:类似POJ的宫殿围墙那道,只不过这道题数据稍微强了一点,有共线的情况 思路:求凸包周长加一个圆周长 /** @Date : 2017-07-20 15:46:44 * @FileNam ...
- [LeetCode] Erect the Fence 竖立栅栏
There are some trees, where each tree is represented by (x,y) coordinate in a two-dimensional garden ...
- [LeetCode] Convex Polygon 凸多边形
Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...
- [LeetCode] Paint Fence 粉刷篱笆
There is a fence with n posts, each post can be painted with one of the k colors. You have to paint ...
- poj 3253 Fence Repair
Fence Repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42979 Accepted: 13999 De ...
- Leetcode: Convex Polygon
Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...
- CF 484E - Sign on Fence
E. Sign on Fence time limit per test 4 seconds memory limit per test 256 megabytes input standard in ...
- poj3253 Fence Repair
http://poj.org/problem?id=3253 Farmer John wants to repair a small length of the fence around the pa ...
- low-rank 的相关求解方法 (CODE) Low-Rank Matrix Recovery and Completion via Convex Optimization
(CODE) Low-Rank Matrix Recovery and Completion via Convex Optimization 这个是来自http://blog.sina.com.cn/ ...
随机推荐
- SAP-批量修改主数据(客户、供应商、物料)
SAP-批量修改主数据(客户.供应商.物料) TCODE: MASS 对于批量修改主数据如客户,供应商等,可以试用一下Mass , 它所能修改的范围如下: 选定要修改的对象后,点击运行,会要求选择需要 ...
- Java 基础功底
Java 基础语法特性: 首先了解并做好Java Web 开发环境配置(包含 JDK 的配置)是非常必要的.其中 CLASSPATH 的值开始必须包含 ".",否则用 javac ...
- activity 的跳转
在app文件夹上右键新建空的activity ,名称为DisplayMessageActivity, 修改layout文件夹下activity_display_message.xml <?xml ...
- Android Studio 使用USB真机调试教程
允许安装未知来源的软件 允许USB调试 设置启动方式 选择USB device 然后运行 会自动安装软件启动! 参考: https://blog.csdn.net/fubo1990/article/d ...
- 三: vue组件开发及自动化工具vue-cli
一: 组件化开发 1 组件 1: 组件(Component)是自定义封装的功能.在前端开发过程中,经常出现多个网页的功能是重复的,而且很多不同的网站之间,也存在同样的功能. 2: 什么是组件 而在网页 ...
- L1-047. 装睡
水题直接上代码: #include<iostream> #include<algorithm> using namespace std; int main() { int n; ...
- webpack优化记录
什么是Webpack . ( 模块打包机,分析项目结构,找到js不能识别的代码语言,转换和打包后,供browser使用 ) WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到 ...
- R语言 平滑连接
参考自 153分钟 使用平滑曲线,沿着X轴从左向右的顺序依次连接,可以使用spline样条函数线. x = 1:5 y = c(1,3,4,2.5,2) plot(x,y) sp = spline(x ...
- Creazy Ideas 智能汽车和智能交通
1.现在无人驾驶靠的是摄像头监测障碍物,计算可行路线(这个结论是看到相关视频中百度无人驾驶测试中大大的摄像头推测的,非确切信息).而非像人一样对客观事物的认知学习得到障碍物的信息,如果能将AI融入进去 ...
- Memcached安装&启动
安装 *Linux系统安装memcached,首先要先安装libevent库,安装请指定 --with--libevent=PATH(若安装过程中出现configure: error : no acc ...