HDOJ 1348 基本二维凸包问题
这次写的凸包用的是Graham scan算法
就数据结构上只是简单地运用了一个栈
#include<stdio.h>
#include<cmath>
#include<algorithm>
//#define LOCAL
using namespace std;
const int max1=1000;
typedef struct point
{
int x;
int y;
}point;
int cp(point a,point b,point c)
{
c.x-=a.x;
c.y-=a.y;
b.x-=a.x;
b.y-=a.y;
return (b.x*c.y-b.y*c.x)>0;
}
int cmp(point a,point b)
{
if(a.y!=b.y) return a.y<b.y;
else return a.x<b.x;
}
double len(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y)*1.0);
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
int t;
point a1[max1+5],a2[max1+5];
int N,L;
int top,mtop,i;
double ans;
scanf("%d",&t);
while(t--)
{
ans=0;
scanf("%d%d",&N,&L);
for(i=0;i<N;i++) scanf("%d%d",&a1[i].x,&a1[i].y);
sort(a1,a1+N,cmp);
a2[0]=a1[0];
for(i=1,top=0;i<N;i++)//寻找最低点到最高点的右凸包
{
while(top!=0&&!cp(a2[top-1],a2[top],a1[i]))//在这里如果两条向量在同一条直线上的话(即CP==0),就将a2【top】弹出
//换成距离更远的点
top--;
a2[++top]=a1[i];
}
a2[++top]=a1[N-1];
mtop=top;
//for(i=0;i<top;i++) printf("%d %d\n",a2[i].x,a2[i].y);
for(i=N-2;i>=0;i--)//寻找最低点到最高点的左凸包
{
while(top!=mtop&&!cp(a2[top-1],a2[top],a1[i]))
top--;
a2[++top]=a1[i];
}
for(i=0;i<top;i++)
{
ans+=len(a2[i],a2[(i+1)%top]);
}
ans+=2*L*3.14159;
printf("%.0lf\n",ans);//四舍五入就行
if(t!=0) printf("\n");
}
return 0;
}
HDOJ 1348 基本二维凸包问题的更多相关文章
- HDOJ(1348)二维凸包
Wall http://acm.hdu.edu.cn/showproblem.php?pid=1348 题目描述:有个国王想在他的城堡外面修围墙,围墙与城堡的最小距离为L,要求围墙长度最短.求围墙的长 ...
- 使用Graham扫描法求二维凸包的一个程序
#include <iostream> #include <cstring> #include <cstdlib> #include <cmath> # ...
- luogu P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
题解: 二维凸包裸题 按照x坐标为第一关键字,y坐标为第二关键字排序 然后相邻判断叉积用单调队列搞过去 正反都做一次就好了 代码: #include <bits/stdc++.h> usi ...
- Luogu P2742 模板-二维凸包
Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...
- 【洛谷 P2742】【模板】二维凸包
题目链接 二维凸包板子..有时间会补总结的. #include <cstdio> #include <cmath> #include <algorithm> usi ...
- poj 2079 Triangle (二维凸包旋转卡壳)
Triangle Time Limit: 3000MS Memory Limit: 30000KB 64bit IO Format: %I64d & %I64u Submit Stat ...
- poj 2187 Beauty Contest(二维凸包旋转卡壳)
D - Beauty Contest Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- UVA 10652 Board Wrapping(二维凸包)
传送门 刘汝佳<算法竞赛入门经典>P272例题6包装木板 题意:有n块矩形木板,你的任务是用一个面积尽量小的凸多边形把它们抱起来,并计算出木板占整个包装面积的百分比. 输入:t组数据,每组 ...
- 【计算几何】二维凸包——Graham's Scan法
凸包 点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内.右图中由红色线段表示的多边形就是点集Q={p0,p1,...p12}的凸包. 一组平面上的点, ...
随机推荐
- Ocelot一个优秀的.NET API网关框架
1 什么是Ocelot? Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fab ...
- 【Java基础】集合
集合 集合概述 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储.另一方面,使用 Array 存储对象方面具有一些弊端,而 Java 集合就像一种容器 ...
- 常用的N个网站建议收藏
类型网站路径学习资源及博客论坛网站 书栈网:https://www.bookstack.cn 52 download: http://www.52download.cn/wpcourse/ 菜鸟教程: ...
- Centos 7 下的KVM虚拟机
一 什么是KVM虚拟机: KVM虚拟机 Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中. ...
- 通过show status 命令了解各种sql的执行频率
show status like 'Com_%'; Com_select | 1 执行select操作的次数,一次查询只累加1 Com_insert ...
- 【Linux】rsync错误解析
rsync: Failed to exec ssh: No such file or directory (2) rsync error: error in IPC code (code 14) at ...
- 浅谈JavaScript代码性能优化
可以通过https://jsbench.me/测试网站完成性能测试. 一.慎用全局变量 1.全局变量定义在全局执行上下文,是所有作用域链的顶端,在局部作用域中没找到的变量都会到全局变量中去查找,所以说 ...
- Sentry(v20.12.1) K8S 云原生架构探索,JavaScript 性能监控之采样 Transactions
系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...
- 消息队列之rabbitmq学习使用
消息队列之rabbitmq学习使用 1.RabbitMQ简介 1.1.什么是RabbitMQ? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,Rabb ...
- FLask的偏函数应用
偏函数 实际上,偏函数主要辅助原函数,作用其实和原函数差不多,不同的是,我们要多次调用原函数的时候,有些参数,我们需要多次手动的去提供值.而偏函数便可简化这些操作,减少函数调用,主要是将一个或多个参数 ...