[POJ1113&POJ1696]凸包卷包裹算法和Graham扫描法应用各一例
凸包的算法比较形象好理解 代码写起来也比较短 所以考前看一遍应该就没什么问题了。。>_<
POJ1113
刚开始并没有理解为什么要用凸包,心想如果贴着城堡走不是更好吗?
突然发现题目中有要求在满足把所有点包括在内的情况下周长最短...这不就是凸包的性质吗?
而且显然如果城堡是凹的话,往里面绕一圈肯定会使周长增加...
然后可以从简单的三角形四边形推广出去,发现每个拐角-左右各90度之后所有的加和为180度
也就是在城堡周长的基础上再加一个半径为L的圆周长即是所求答案。
上次的模板写错了...应该是快排部分没有处理好...这次重新写的时候才发现...
program poj1113;
const pi=3.14159265358979;maxn=;
type point=record x,y:longint;end;
var i,n,l,len:longint;
ans:extended;
a:array[-..maxn]of point;
dis:array[-..maxn]of int64;
stack:array[-..maxn]of point; function getdis(a,b:point):int64;
begin
exit(sqr(a.x-b.x)+sqr(a.y-b.y));
end; function cross(p0,p1,p2:point):int64;
begin
exit((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
end; procedure qsort(L,R:longint);
var i,j,mid:longint;
midy:int64;
midx:point;
begin
i:=L;j:=R;mid:=random(R-L+)+L;
midx:=a[mid];midy:=dis[mid];
repeat
while (i<R)and((cross(a[],a[i],midx)>)or((cross(a[],a[i],midx)=)and(dis[i]<midy))) do inc(i);
while (L<j)and((cross(a[],a[j],midx)<)or((cross(a[],a[j],midx)=)and(dis[j]>midy))) do dec(j);
if i<=j then
begin
a[]:=a[i];a[i]:=a[j];a[j]:=a[];
dis[]:=dis[i];dis[i]:=dis[j];dis[j]:=dis[];
//之前的模板这里的dis数组没有交换,那道题是平面最远点对的...就导致取错了点。
inc(i);dec(j);
end;
until i>j;
if i<R then qsort(i,R);
if L<j then qsort(L,j);
end; procedure Graham(n:longint;var len:longint);
var k,i:longint;
begin
k:=;a[].x:=maxlongint;a[].y:=maxlongint;
for i:= to n do
if (a[i].y<a[k].y)or((a[i].y=a[k].y)and(a[i].x<a[k].x)) then k:=i;
a[]:=a[];a[]:=a[k];a[k]:=a[];
for i:= to n do dis[i]:=getdis(a[i],a[]);
qsort(,n);
len:=;stack[]:=a[];stack[]:=a[];stack[]:=a[];
for i:= to n do
begin
while cross(stack[len-],a[i],stack[len])>= do dec(len);
//要求边上的点也取的话就不能加等号
inc(len);stack[len]:=a[i];
end;
end; begin
//assign(input,'poj1113.in');reset(input);
readln(n,l);
for i:= to n do readln(a[i].x,a[i].y);
Graham(n,len);
ans:=sqrt(getdis(stack[],stack[len]));
//累计周长不能忘了第一个点和第n个点之间的边
//这里虽然容易检查出来但是希望下次累计长度的时候还是不要忘。。>_<
for i:= to len do ans:=ans+sqrt(getdis(stack[i],stack[i-]));
writeln(ans+*pi*l::);
end.
POJ1696
人生多艰...
话说好像还把在我后面评测的同学影响成了CE...QAQ
这道题只要不停地取满足条件的对于当前点最右边的点,当然要保证当前点右拐没有没取过的点。
首先肯定是都可以取到的,然后用卷包裹不停地取就好了...
这题唯一需要修改的就是取过的点要打标记,然后就轻松AC啦~
program poj1696;
const maxn=;
type point=record x,y,id:longint;end;
var t,test,i,n:longint;
a:array[-..maxn]of point;
vis:array[-..maxn]of boolean;
s:point; function cross(p0,p1,p2:point):longint;
begin
exit((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
end; function getdis(a,b:point):longint;
begin
exit(sqr(a.x-b.x)+sqr(a.y-b.y));
end; procedure Wrap(s:point);
var i,j,k:longint;
begin
fillchar(vis,sizeof(vis),true);
write(n,' ');
for i:= to n do
begin
for j:= to n do if vis[j] then begin k:=j;break;end;
// 刚开始TOO NAIVE...给k的初值赋为0,然后0节点搞了个(0,1000),后来发现这满足刚开始的条件QAQ
// 为了维护世界的和平...还是尽量不要用没有出现过的点好了...
for j:= to n do if (vis[j])and((cross(s,a[j],a[k])>)or((cross(s,a[j],a[k])=)and(getdis(a[j],s)<getdis(a[k],s)))) then k:=j;
write(a[k].id,' ');s:=a[k];vis[k]:=false;
end;
end; begin
//assign(input,'poj1696.in');reset(input);
readln(test);
for t:= to test do
begin
readln(n);s.x:=;s.y:=maxlongint;
for i:= to n do
begin
readln(a[i].id,a[i].x,a[i].y);
if a[i].y<s.y then s.y:=a[i].y;
end;
Wrap(s);writeln;
end;
end.
[POJ1113&POJ1696]凸包卷包裹算法和Graham扫描法应用各一例的更多相关文章
- 2018.07.04 POJ 1696 Space Ant(凸包卷包裹)
Space Ant Time Limit: 1000MS Memory Limit: 10000K Description The most exciting space discovery occu ...
- (模板)poj1113(graham扫描法求凸包)
题目链接:https://vjudge.net/problem/POJ-1113 题意:简化下题意即求凸包的周长+2×PI×r. 思路:用graham求凸包,模板是kuangbin的. AC code ...
- POJ 1696 Space Ant 卷包裹法
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3316 Accepted: 2118 Descrip ...
- 凸包算法(Graham扫描法)详解
先说下基础知识,不然不好理解后面的东西 两向量的X乘p1(x1,y1),p2(x2,y2) p1Xp2如果小于零则说明 p1在p2的逆时针方向 如果大于零则说明 p1在p2的顺时针方向 struct ...
- [hdu contest 2019-07-29] Azshara's deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法
今天hdu的比赛的第一题,凸包+区间dp. 给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相 ...
- (模板)graham扫描法、andrew算法求凸包
凸包算法讲解:Click Here 题目链接:https://vjudge.net/problem/POJ-1113 题意:简化下题意即求凸包的周长+2×PI×r. 思路:用graham求凸包,模板是 ...
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- 经典算法和OJ网站(开发者必备-转)
一. Online Judge简介: Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序多种程序(如C.C++.Pascal)源代码,系统对源代码进行编译和执行,并通过 ...
- 【BZOJ-1670】Building the Moat护城河的挖掘 Graham扫描法 + 凸包
1670: [Usaco2006 Oct]Building the Moat护城河的挖掘 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 464 Solv ...
随机推荐
- ethtool speed HowTo : Change Speed and Duplex of Ethernet card in Linux
To change Speed and Duplex of an ethernet card, we can use ethtool - a Linux utility for Displaying ...
- 【APUE】Chapter10 Signals
Signal主要分两大部分: A. 什么是Signal,有哪些Signal,都是干什么使的. B. 列举了非常多不正确(不可靠)的处理Signal的方式,以及怎么样设计来避免这些错误出现. 10.2 ...
- swagger webapi控制器注释不显示
swagger是webapi文档描述及调试工具,要在asp.net mvc中使用swagger,需要安装Swashbuckle.Core这个包,安装好后会在app_start中生成SwaggerCon ...
- 1003 Emergency (25 分)(求最短路径)
给出N个城市,m条无向边.每个城市中都有一定数目的救援小组,所有边的边权已知.现在给出起点和终点,求从起点到终点的最短路径条数及最短经上的救缓小组数目只和.如果有多条最短路径,则输出数目只和最大的 D ...
- SpringBoot:工厂模式实现定时任务可配置
pringBoot:工厂模式实现定时任务可配置 需要:使用springboot,实现定时任务可配置. 定时任务可在代码中写死,在配置文件中配置,这些都不能实现定时任务在服务器不重启的情况下可配置. 为 ...
- 山科SDUST OJ Problem J :连分数
Problem J: 连分数 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2723 Solved: 801[Submit][Status][Web B ...
- 面试题中经常遇到的SQL题:删除重复数据,保留其中一条
如题,解决思路如下: 1.首先我们需要找出拥有重复数据的记录 ---以name字段分组 select Name,COUNT(Name) as [count] from Permission group ...
- postman工具【接口自动化测试关于断言】
在使用postman工具进行接口自动化时我们经常需要断言来进行判断,结果到底是成功还是失败. 但在collection runner/Newman里如果不加断言,跑完后都无法知道是成功还是失败 断言是 ...
- 关于debian配置的问题汇总
debian的apache多域名配置: https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-ho ...
- web相关基础知识3
一 .浮动布局 ★元素浮动之后不占据原来的位置,脱离标准流 ★浮动的盒子在一行上显示 ★行内元素浮动之后转换为行内块元素.(不推荐使用,会脱离标准流,转行内元素最好使用display: inlin ...