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


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. 学习SQLite基本语句

    SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同,SQLite 的安装和运行非 ...

  2. SSM框架学习思维导图

    SSM框架学习思维导图 2017年08月11日 20:17:28 阅读数:1141 放上前段时间学习SSM框架以及Spring.SpringMVC.MyBatis的学习结果,输出思维导图一共四幅图.这 ...

  3. javaX邮件发送

    /** * *  * @param mailServerHost 邮件服务器 * @param mailServerPort 端口 * @param validate 是否需要身份验证 * @para ...

  4. 剑指offer-二叉树的镜像18

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  5. [Effective Python] 用Pythonic方式来思考

    Effective Python chap.1 用Pythonic方式来思考 Pythonic: 一门语言的编程习惯是由用户来确立的. 1. 确认自己所使用的Python版本 2. 遵循PEP8风格指 ...

  6. C#非托管跨线程委托调试

    使用C#调用mingw的so文件,拿视频数据回wpf的界面进行显示,注册了回调函数.C++在调用回调函数时遇到了委托被回收的问题,提示:“类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏 ...

  7. android http

    在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端.它提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET ...

  8. iOS-开发,拨打电话

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"te ...

  9. 【EasyNetQ】- 请求回复

    EasyNetQ还支持请求/响应消息传递模式.这使得实现客户端/服务器应用程序变得容易,客户端向服务器发出请求,然后服务器处理请求并返回响应.与传统的RPC机制不同,EasyNetQ请求/响应操作没有 ...

  10. [剑指Offer] 37.数字在排序数组中出现的次数

    题目描述 统计一个数字在排序数组中出现的次数. [思路]因为是排序数组,所以可以用二分法搜索到要查找的值在数组中的一个位置,接着向两侧扫描,遇到不等的就停止. class Solution { pub ...