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


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. kill -9 vs killall

    kill Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后 ...

  2. 什么鬼,又不知道怎么命名class了

    什么鬼,又不知道怎么命名class了 2015/10/25 · CSS · class 分享到:5 原文出处: 结一(@结一w3cplus)    相信写css的人都会遇到下面的问题: 糟糕,怎么命名 ...

  3. Python连接符的种类和使用区别

    python的连接符主要有 加号(+).逗号(,).空格(   ) .反斜线(\).join()的方式. 加号(+),demo如下: #注意,+只能连接字符串,如果一个是字符串一个是数字就会报错 pr ...

  4. javascript中容易出bug的语句

    一.forEach方法 forEach方法中没法用continue来实现跳过单句到下一次循环,如果要跳到下一次循环,要用return关键字,如果想直接跳出forEach循环,具我所知的,要throw一 ...

  5. 孤荷凌寒自学python第七十二天开始写Python的第一个爬虫2

    孤荷凌寒自学python第七十二天开始写Python的第一个爬虫2 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...

  6. JavaSE复习(四)File类与IO流

    File类 构造方法 public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例. public File(String parent ...

  7. centos7 centos6中 更改默认的系统启动级别

    centos6中更改默认的启动级别 方法: 1.vi /etc/inittab 2.找到id:x:initdefault:,我的系统是id:3:initdefault:,即默认以字符模式启动. 3.将 ...

  8. C语言数组作业总结

    数组作业总结 评分注意事项. 注意用Markdown语法排版,尤其注意伪代码用代码符号渲染.用符号 ``` 生成代码块. 变量名不规范,没注释,没缩进,括号不对齐,倒扣5分. PTA上写的所有代码务必 ...

  9. 算法(4) Rotate Image

    题目:把一个N×N的矩阵旋转90° 思路:这个题目折腾了好长时间,确切地说是两个小时!这道题也反映出自己的逻辑比较混乱 这道题我到底卡在了哪里?自己已经在本子上画出了一个转移的关系 a[0][0] - ...

  10. sql如何先排序再去重

    场景 有一张得分表(score),记录了用户每次的得分,同一个人可能有多个得分. id name score 1 tom 45 2 jack 78 3 tom 34 . . . 需求:找出分数最高的前 ...