凸包的算法比较形象好理解 代码写起来也比较短 所以考前看一遍应该就没什么问题了。。>_<


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扫描法应用各一例的更多相关文章

  1. 2018.07.04 POJ 1696 Space Ant(凸包卷包裹)

    Space Ant Time Limit: 1000MS Memory Limit: 10000K Description The most exciting space discovery occu ...

  2. (模板)poj1113(graham扫描法求凸包)

    题目链接:https://vjudge.net/problem/POJ-1113 题意:简化下题意即求凸包的周长+2×PI×r. 思路:用graham求凸包,模板是kuangbin的. AC code ...

  3. POJ 1696 Space Ant 卷包裹法

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3316   Accepted: 2118 Descrip ...

  4. 凸包算法(Graham扫描法)详解

    先说下基础知识,不然不好理解后面的东西 两向量的X乘p1(x1,y1),p2(x2,y2) p1Xp2如果小于零则说明  p1在p2的逆时针方向 如果大于零则说明 p1在p2的顺时针方向 struct ...

  5. [hdu contest 2019-07-29] Azshara's deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法

    今天hdu的比赛的第一题,凸包+区间dp. 给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相 ...

  6. (模板)graham扫描法、andrew算法求凸包

    凸包算法讲解:Click Here 题目链接:https://vjudge.net/problem/POJ-1113 题意:简化下题意即求凸包的周长+2×PI×r. 思路:用graham求凸包,模板是 ...

  7. 最小生成树---Prim算法和Kruskal算法

    Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...

  8. 经典算法和OJ网站(开发者必备-转)

    一. Online Judge简介: Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序多种程序(如C.C++.Pascal)源代码,系统对源代码进行编译和执行,并通过 ...

  9. 【BZOJ-1670】Building the Moat护城河的挖掘 Graham扫描法 + 凸包

    1670: [Usaco2006 Oct]Building the Moat护城河的挖掘 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 464  Solv ...

随机推荐

  1. .NET基础知识之八——深拷贝,浅拷贝

    目录 1.概念 2.使用赋值符号"=" 3.浅复制 4.深复制 5.问题一:如果类里面嵌套有多个类,然后嵌套类里面又嵌套类,那么像上面实现深拷贝的方法还能用吗? 6.问题二:实现深 ...

  2. 通过圆形按钮的绘制熟悉Qt的绘图机制,掌握这种终极方法

    基本上用QPainter就可以实现 1. QPainter painter(this); //开始的标志(可以不用) painter.begin(this); //保存最初的设置 painter.sa ...

  3. jenkins安全内容配置策略

    有时我们使用HTML Publisher Plugin插件时,在jenkins点开html report,会发现没有带任何的css或js样式,这是因为Jenkins 1.641 / Jenkins 1 ...

  4. 【廖雪峰老师python教程】day1

    主要内容摘要 函数参数[个人感觉难度很大,却很重要,可以先大概记一记]不要用的太复杂.戳这儿温习 递归函数:使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出.重点:找到递归关系和终止条件 ...

  5. 「暑期训练」「Brute Force」 Money Transfers (CFR353D2C)

    题目 分析 这个Rnd353真是神仙题层出不穷啊,大力脑筋急转弯- - 不过问题也在我思维江化上.思考任何一种算法都得有一个“锚点”,就是说最笨的方法怎么办.为什么要这么思考,因为这样思考最符合我们的 ...

  6. java---解析XML文件,通过反射动态将XML内容封装到一个类中

    本博客讲的XML解析,使用的是dom4j. 首先建立一个maven项目,在dom.xml中引入相应的dom4j的版本.作者下载的是热度很高的1.6.1版本.maven的使用在这里不做详细讲解. 引入成 ...

  7. 使用fiddler对手机上的APP进行抓包

    前提: 1.必须确保安装fiddler的电脑和手机在同一个wifi环境下 备注:如果电脑用的是台式机,可以安装一个随身wifi,来确保台式机和手机在同一wifi环境下 安装配置步骤: 1.下载一个fi ...

  8. tp5 常见问题 模板文件 路由

    W:视图 Q:是MVC中的V,也就是在模块下面的view目录下的html文件,就是写的页面. W:模板 Q:视图在控制器的叫法,在fetch,display等方法中传入的模板参数   最后传到视图. ...

  9. 参加2018之江杯全球人工智能大赛 :视频识别&问答(四)

    很遗憾没有在规定的时间点(2018-9-25 12:00:00)完成所有的功能并上传数据,只做到写了模型代码并只跑了一轮迭代,现将代码部分贴出. import keras from keras.lay ...

  10. BZOJ 2049 SDOI2008 洞穴勘测 LCT板子

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2049 题意概述:给出N个点,一开始不连通,M次操作,删边加边,保证图是一个森林,询问两点连 ...