POJ-1113 Wall 计算几何 求凸包
题目链接:https://cn.vjudge.net/problem/POJ-1113
题意
给一些点,求一个能够包围所有点且每个点到边界的距离不下于L的周长最小图形的周长
思路
求得凸包的周长,再加上一个半径为L的圆的周长
提交过程
| CE | 注意某些OJ上cmath库里没有M_PI |
| AC |
代码
#define PI 3.1415926
#include <cmath>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const double eps=1e-10;
struct Point{
double x, y;
Point(int x=0, int y=0):x(x), y(y) {}
// no known conversion for argument 1 from 'Point' to 'Point&'
Point operator + (Point p){return Point(x+p.x, y+p.y);}
Point operator - (Point p){return Point(x-p.x, y-p.y);}
Point operator * (double k){return Point(k*x, k*y);}
Point operator / (double k){return Point(x/k, y/k);}
bool operator < (Point p) const{return (x==p.x)?(y<p.y):(x<p.x);} // need eps?
bool operator == (const Point p) const{return fabs(x-p.x)<eps&&fabs(y-p.y)<eps;}
double norm(void){return x*x+y*y;}
double abs(void){return sqrt(norm());}
double dot(Point p){return x*p.x+y*p.y;} // cos
double cross(Point p){return x*p.y-y*p.x;} // sin
};
struct Segment{Point p1, p2;};
struct Circle{Point o; double rad;};
typedef Point Vector;
typedef vector<Point> Polygon;
typedef Segment Line;
int ccw(Point p0, Point p1, Point p2){
Vector v1=p1-p0, v2=p2-p0;
if (v1.cross(v2)>eps) return 1; // anti-clockwise
if (v1.cross(v2)<-eps) return -1; // clockwise
if (v1.dot(v2)<0) return 2;
if (v1.norm()<v2.norm()) return -2;
return 0;
}
Point project(Segment s, Point p){
Vector base=s.p2-s.p1;
double k=(p-s.p1).cross(base)/base.norm();
return s.p1+base*k;
}
Point reflect(Segment s, Point &p){
return p+(project(s, p)-p)*2;
}
double lineDist(Line l, Point p){
return abs((l.p2-l.p1).cross(p-l.p1)/(l.p2-l.p1).abs());
}
double SegDist(Segment s, Point p){
if ((s.p2-s.p1).dot(p-s.p1)<0) return Point(p-s.p1).abs();
if ((s.p1-s.p2).dot(p-s.p2)<0) return Point(p-s.p2).abs();
return abs((s.p2-s.p1).cross(p-s.p1)/(s.p2-s.p1).abs());
}
bool intersect(Point p1, Point p2, Point p3, Point p4){
return ccw(p1, p2, p3)*ccw(p1, p2, p4)<=0 &&
ccw(p3, p4, p1)*ccw(p3, p4, p2)<=0;
}
Point getCrossPoint(Segment s1, Segment s2){
Vector base=s2.p2-s2.p1;
double d1=abs(base.cross(s1.p1-s2.p1));
double d2=abs(base.cross(s1.p2-s2.p1));
double t=d1/(d1+d2);
return s1.p1+(s1.p2-s1.p1)*t;
}
double area(Polygon poly){
double res=0; long long size=poly.size();
for (int i=0; i<poly.size(); i++)
res+=poly[i].cross(poly[(i+1)%size]);
return abs(res/2);
}
int contain(Polygon poly, Point p){
int n=poly.size();
bool flg=false;
for (int i=0; i<n; i++){
Point a=poly[i]-p, b=poly[(i+1)%n]-p;
if (ccw(poly[i], poly[(i+1)%n], p)==0) return 1; // 1 means on the polygon.
if (a.y>b.y) swap(a, b);
if (a.y<0 && b.y>0 && a.cross(b)>0) flg=!flg;
}return flg?2:0; // 2 fo inner, 0 for outer.
}
Polygon convexHull(Polygon poly){
if (poly.size()<3) return poly;
Polygon upper, lower;
sort(poly.begin(), poly.end());
upper.push_back(poly[0]); upper.push_back(poly[1]);
lower.push_back(poly[poly.size()-1]); lower.push_back(poly[poly.size()-2]);
for (int i=2; i<poly.size(); i++){
for (int n=upper.size()-1; n>=1 && ccw(upper[n-1], upper[n], poly[i])!=-1; n--)
upper.pop_back();
upper.push_back(poly[i]);
}
for (int i=poly.size()-3; i>=0; i--){
for (int n=lower.size()-1; n>=1 && ccw(lower[n-1], lower[n], poly[i])!=-1; n--)
lower.pop_back();
lower.push_back(poly[i]);
}
for (int i=1; i<lower.size(); i++)
upper.push_back(lower[i]);
return upper;
}
int main(void){
int n, L;
double x, y;
while (scanf("%d%d", &n, &L)==2 && n){
Polygon poly, hull;
for (int i=0; i<n; i++){
scanf("%lf%lf", &x, &y);
poly.push_back(Point(x, y));
}
hull=convexHull(poly);
double ans=0;
for (int i=0; i<hull.size(); i++)
ans+=(hull[i]-hull[(i+1)%hull.size()]).abs();
printf("%.0f\n", ans+2*PI*L);
}
return 0;
}
| Time | Memory | Length | Lang | Submitted |
|---|---|---|---|---|
| 47ms | 652kB | 3659 | G++ | 2018-08-01 11:23:54 |
POJ-1113 Wall 计算几何 求凸包的更多相关文章
- POJ 1113 Wall(计算几何の凸包)
Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...
- POJ 1113 Wall 凸包 裸
LINK 题意:给出一个简单几何,问与其边距离长为L的几何图形的周长. 思路:求一个几何图形的最小外接几何,就是求凸包,距离为L相当于再多增加上一个圆的周长(因为只有四个角).看了黑书使用graham ...
- poj 1113:Wall(计算几何,求凸包周长)
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28462 Accepted: 9498 Description ...
- 计算几何--求凸包模板--Graham算法--poj 1113
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28157 Accepted: 9401 Description ...
- POJ 1113 Wall 凸包求周长
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26286 Accepted: 8760 Description ...
- POJ 1113 Wall 求凸包的两种方法
Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 31199 Accepted: 10521 Descriptio ...
- POJ 1113 Wall 求凸包
http://poj.org/problem?id=1113 不多说...凸包网上解法很多,这个是用graham的极角排序,也就是算导上的那个解法 其实其他方法随便乱搞都行...我只是测一下模板... ...
- POJ 1113 Wall(Graham求凸包周长)
题目链接 题意 : 求凸包周长+一个完整的圆周长. 因为走一圈,经过拐点时,所形成的扇形的内角和是360度,故一个完整的圆. 思路 : 求出凸包来,然后加上圆的周长 #include <stdi ...
- POJ 1113 Wall【凸包周长】
题目: http://poj.org/problem?id=1113 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...
随机推荐
- js 屏蔽非数字字符输入
在有输入字符为数字字符的需求时,首先想到的是设置 input 的 type 为 number / tel,原因见之前的 移除input number的上下箭头 . 好巧不巧的时,在最见的项目中,碰到了 ...
- VMware虚拟机共享文件夹
安装好虚拟文件夹后,第二次开机时发现/mnt/hgfs目录下找不到共享的文件夹,原因是vmfg-fuse服务没有开启. 在root的配置文件中添加如下代码,设置开机自启: /usr/bin/vmhgf ...
- BZOJ 1030 [JSOI2007]文本生成器 (Trie图+DP)
题目大意:给你一堆字符串,一个串不合法的条件是这些字符串中任意一个是这个串的子串,求合法的串的数量 其实这道题比 [HNOI2008]GT考试 那道题好写一些,但道理是一样的 只不过这道题的答案可以转 ...
- tensorflow的tf.train.Saver()模型保存与恢复
将训练好的模型参数保存起来,以便以后进行验证或测试.tf里面提供模型保存的是tf.train.Saver()模块. 模型保存,先要创建一个Saver对象:如 saver=tf.train.Saver( ...
- 【Codeforces Round #482 (Div. 2) C】Kuro and Walking Route
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把x..y这条路径上的点标记一下. 然后从x开始dfs,要求不能走到那些标记过的点上.记录节点个数为cnt1(包括x) 然后从y开始 ...
- 数人云CTO解读Docker 1.12和金融业容器化
7月29日 数人云 在上海举办金融沙龙,邀请上交所和近二十家来自银行.保险.证券的IT技术专家一同探讨容器技术在金融业中的最佳实践.数人云CTO肖德时在会上将传统金融行业通过容器可以解决的四大问题做了 ...
- dubbo Failed to check the status of the service com.user.service.UserService. No provider available for the service
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'u ...
- uva725_一道水题(优化到了29ms)
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- 基于redis ae实现 Linux中的文件系统监控机制(inotify)
(英文部分为转的.代码是个人代码) 1 What's inotify The inotify API provides a mechanism for monitoring file system ...
- Python——异常基础
异常基础 在Python中,异常会依据错误自己主动地被触发.也能由代码触发和截获.异常由五个语句处理: 1.[try/except]:捕捉由Python或你引起的异常并恢复. 2.[try/final ...