04 2011 档案
摘要:http://poj.org/problem?id=2653顺序的在地上扔一些细棒,求最后没有被压的细棒。我是用list容器存储,枚举过去,有被压的就删除,效率比较底,运行800多ms。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<cmath>#include<list>using namespace std;struct point{double x,y;};struct line{point a,b;int
阅读全文
摘要:http://poj.org/problem?id=1556求点(0,5)到(10,5)的最短距离。图中任意两点(x座标不同)连线若没有与墙相交,则求出两点之间的距离加入最短路矩阵中,否则为无穷大。接下来用dijkstra法求最短路即可。本题主要建图比较繁琐一点。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<cmath>using namespace std;struct point{double x,y;};struct
阅读全文
摘要:http://poj.org/problem?id=1269一、判断是否共线 相当于判断三点是否共线,叉积等0是即为共线。二、判断是否平行 设向量A=(a,b) 向量B=(c,d)若向量A与B平行则a/c=b/d;三、求交点这里也用到叉积的原理。假设交点为p0(x0,y0)。则有:(p1-p0)X(p2-p0)=0(p3-p0)X(p2-p0)=0展开后即是(y1-y2)x0+(x2-x1)y0+x1y2-x2y1=0(y3-y4)x0+(x4-x3)y0+x3y4-x4y3=0将x0,y0作为变量求解二元一次方程组。假设有二元一次方程组a1x+b1y+c1=0;a2x+b2y+c2=...
阅读全文
摘要:http://poj.org/problem?id=1042 John要以1到n的地点钓鱼,且只能从i点走到i+1点,从i点走到i+1点所花时间为5*ti。开始时每个地点的每五分钟之内可钓到鱼fi只,下一个五分钟会递减di。求在给定的时间内最多能钓到多少鱼。 枚举钓鱼的结束地点。先总时间减去路上行走所花的时间。接下来我们可以想像为John可以在各个钓鱼地点之间瞬间移动,(从起点到结束点),那么在每个五分钟我们都可以选择钓到最多鱼的地点钓鱼。 本题要注意,若有多个方案,要以在地点1花费时间多的为答案,若地点1的时间花费相同,则以地点2为基准,以此类推。#include<stdio.h...
阅读全文
摘要:http://poj.org/problem?id=1328X轴的上方代表海,下方代表陆地。海中有多个岛屿,X轴上可任意放置半径为d的雷达,求至少放置多少个雷达可覆盖所有岛屿,不能完成输出-1。 以岛屿为圆心做半径为d的圆,可在X轴上产生两个交点,即为X轴上可覆盖该岛屿的区间,求出所有岛屿所对应的区间,将交集不为空的区间分为一组,这样你会发现答案其实就是求区间可分为多少组。#include<stdio.h>#include<stdlib.h>#include<algorithm>#include<iostream>#include<math
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1052田忌赛马先把田忌和国王的马排序。每次取田忌的最快的马与国王最快的马比较,有三种情况。一,田忌最快的马比国王最快的快,那么直接拿田忌最快的马去赢国王最快的马。二,田忌最快的马比国王最快的慢,那么拿田忌最慢的马去输国王最快的马。三,田忌最快的马与国王最快的马速度一样。这时就比较麻烦一点了。 先拿田忌最慢的马与国王最慢的马比较。 若比国王快,直接去赢掉国王最慢的马。 否则田忌最慢的马再去与国王最快的马比较,此时这两只马必定是要比赛的,只是比较一下速度而以。给一些测试数据:输入:24 63 624 65 ...
阅读全文
摘要:http://acm.uestc.edu.cn/problem.php?pid=1447给定一组点集,求至多选四点,使其所围成的面积最大。刚开始四重循环,直接超时掉。后来听说要用到旋转卡壳,且是在求三角形面积基础上求四边形面积的。在AC了一道旋转卡壳法求最大三角形面积后,终于把这道给A了。本题可以把四边形分为两个三角形的并,再用旋转卡壳法分别求出这两个三角形的最大面积。如下图所示,固定i,j点,分别找到这样的h,k点使三角形ijk和三角形ijh面积都最大。#include<stdio.h>#include<stdlib.h>#include<string.h>
阅读全文
摘要:http://poj.org/problem?id=3304在二维空间上,给定一组线段,能否存在这样的一条直线,使所有线段在这条直线的投影会在一个点上。如果沿着这个投影点做直线的垂线,那么这条垂线必会与所有的线段相交。那么本题就转换为能否找到一条直线与所有的线段相交。想找这样的直线,就要去离散化的枚举,本题怎样有效的枚举是关键。首先假设有一条直线与所有的线段相交,慢慢平移这条直线,使它恰好在某条线段L1的端点上。当然这个时候直线还是与所有的线段相交。然后让直线在这个端点上慢慢旋转,使到直线又经过线段L2的端点。L2和L1要满足不是同一条线段,就算相同,你仍可以继续旋转,总会让直线找到L2,且不
阅读全文
摘要:http://poj.org/problem?id=2079给定一组点集,选择三点组成三角形,且面积最大。肯定要求出这组点的凸包,接下来就不能想当然的三重循环枚举三点,这样很容易超时。这时就要用到神奇的旋转卡壳法。取凸包的三点i,j,k。先固定i,j。逆时针(当然你也可以顺时针)变换k,你会发现i,j,k三点组成的三角形面积具有单峰性。即如果第一次找到Area(i,j,k+1)<Area(i,j,k),那么此时就是在i,j固定下的形成最大面积的k点了。这样两重循环枚举i,j,时间复杂度为o(n^2)。也许有人会认为不是也要找k吗?时间复杂度为(n^3)才对。非也,如果你认真观察的话,你会
阅读全文
摘要:http://poj.org/problem?id=2398poj2318的翻版,所不同的是本题所给的线并不排好序的,加一个sort()函数排序即可。(poj2318解题报告)#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;double y1,y2,**p=new double*[1005];double judge(int j,double x,double y)
阅读全文
摘要:把一个矩形分成多个格子,矩形上分布多个点,求每个格子的拥有的点数。简单的叉乘运用,查找时要用二分查找,不然很容易超时。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>using namespace std;double y1,y2,p[5005][2];double judge(int j,double x,double y){ return (p[j][1]-p[j][0])*(y-y1)-(y2-y1)*(x-p[j][0]); //叉乘判断方向,大
阅读全文
摘要:转自: http://hi.baidu.com/novosbirsk/blog/item/0bf7408fc05bf1e2f01f3622.html之前写过一篇《POJ计算几何入门题目推荐》。本来是随意写写,想不到这篇文章成为了我 blog浏览量第二高的文章,还被许多ACMer转载到其他地方。最近估计ACM赛季又到了,不少热心的ACMER加我Q,询问我那篇文章的事情,希望我再给出一些题目。 本人已经退役了,本来不想再写一些关于ACM的东西了,以免因为自己水平有限,思想落后,误导他人。不过后来想到这个空间晾着也比较尴尬,让各位找新文章 的 ACMER经常扑空我十分过意不去,所以整理了一下以...
阅读全文
摘要:转自http://hi.baidu.com/novosbirsk/blog/item/723a9727a9ab8804918f9dca.html其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中。之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专业,GIS)。以后若有机会,我会补充、完善这个列表。计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠。3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模板。如果代码一片
阅读全文
摘要:http://poj.org/problem?id=1077#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<queue>using namespace std;/* 把1..n的排列映射为数字 0..(n!-1) */int fac[] = { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880 };//...int order(const char *s, int n) {//康托展开 i
阅读全文
摘要:时间复杂度(渐近时间复杂度的严格定义,NP问题,时间复杂度的分析方法,主定理)排序算法(平方排序算法的应用,Shell排序,快速排序,归并排序,时间复杂度下界,三种线性时间排序,外部排序)数论(整除,集合论,关系,素数,进位制,辗转相除,扩展的辗转相除,同余运算,解线性同余方程,中国剩余定理)指针(链表,搜索判重,邻接表,开散列,二叉树的表示,多叉树的表示)按位运算(and,or,xor,shl,shr,一些应用)图论(图论模型的建立,平面图,欧拉公式与五色定理,求强连通分量,求割点和桥,欧拉回路,AOV问题,AOE问题,最小生成树的三种算法,最短路的三种算法,标号法,差分约束系统,验证二分图
阅读全文
摘要:http://poj.org/problem?id=2286今天又做了个迭代加深,不错继续努力!! 移动八根线中任一根,移法为头的数移到线的尾,其它的数向头进一位。求最少要移多少次才能使中间的八个数相等。本题若用广搜,空间需求量非常大,空间不足。深搜的话,深度很难控制,容易陷入死循环。在这个时候就要用到迭代加深的深搜方法。所谓迭代加深,就是在深度无上限的情况下,先预估一个深度(尽量小)进行搜索,如果没有找到解,再逐步放大深度搜索。这种方法虽然会导致重复的遍历 某些结点,但是由于搜索的复杂度是呈指数级别增加的,所以对于下一层搜索,前面的工作可以忽略不计,因而不会导致时间上的亏空。这种方法,可以算
阅读全文
摘要:http://poj.org/problem?id=2312 相信坦克大战大家都玩过吧,本题就是根据这个游戏设计的。坦克要从起点(Y),到目的地(T),坦克不能通过钢墙(S),河(R),可以在空地在行走(E),射击破坏砖墙(B),射击砖墙时不行走且花费一个单位的时间。求坦克从起点到目的地最少花多少时间,不可达输出-1; 很好的一道搜索题。因为考虑到通过砖墙时和空地所花的时间不同,所以不能简单的用BFS广搜来做。用DFS深搜,你会发现时间复杂非常高,必然会超时(最大是300*300的图)。本题可以能过优先队列+bfs 或 记忆化广搜两种方法来解决。一、优先队列+BFS法: 也是用到了广搜的思想,
阅读全文
摘要:找某颗星的左下角有几颗星。输出有多少颗星左下角拥有0颗星,有多少颗左下角拥有1颗星……一直到n-1 。因为输入时是按y值是递增的,所以直接用x(x也是递增的)来构建树状数组,接下来其实就是统计x 前面有多少个比它少的数。树状数组参考:http://zxj015.blog.163.com/blog/static/170613730201136105251115/#include<iostream>#include<stdio.h>#include<stdlib.h>using namespace std;const int MAX = 32002;int n,
阅读全文
摘要:http://poj.org/problem?id=2299给定一个整数数列,相邻之间的数可以互换,求最少要多少次互换后得到一个升序数列。本题说白了就是求解逆序对问题(关于逆序对请参考:http://baike.baidu.com/view/689576.htm),接下来便是用归并排序来解逆序对了。#include <stdio.h>#include <stdlib.h>#define MAX 500001int n, a[MAX], t[MAX];__int64 sum;void Merge(int l, int m, int r){ int p = 0; int i
阅读全文
摘要:http://poj.org/problem?id=3321一棵树,开始时每个结点都有一个苹果,输入C x表示更新x结点,若x结点有苹果,把该结点苹果摘掉,若该节点无苹果,在该节点上增加一个新的苹果。输入Q x表示以该节点为根的子树有多少个苹果。伸手便该题主要问题是如何把一棵树转化为树状数组,之后便可以直接运用树状数组来求区间的和。转化的方法是用dfs深搜遍历树,每一个结点要做两次标记,第一次访问到时标记该结点,即为该结点在树状数组中的起始位置,第二次当dfs深搜返回时又一次标记,即为该结点在树状数组中末位置,始末位置之间即代表了以该结点为根的子树的所有结点。有关树状数组问题可以参考:http
阅读全文
摘要:在这里还是先转一篇较好的讲解学习一下。http://www.cnblogs.com/yykkciwei/archive/2009/05/08/1452889.html树状数组问题提出:已知数组a[],元素个数为n,现在更改a中的元素,要求得新的a数组中i到j区间内的和(1<=i<=j<=n).思考:对于这个问题,我们可以暴力地来解决,从a[i]一直累加到a[j],最坏的情况下复杂度为O(n),对于m次change&querry,合起来的复杂度为O(m*n),在n或m很大的情况下,这样的复杂度是让人无法忍受的.另外,如果没有元素的变更,我们完全可以存储sum[1,k](
阅读全文
摘要:http://poj.org/problem?id=3083入口S,出口E,分别求由入口 到出口靠左走,靠右走,和最短路三种走法各自的步数。入口和出口在边界处,并且不会在四个角上,入口和出口至少隔着一个阻碍。本来是想找一个广搜和深搜结合的题目,百度一下找到的这题,后来发现这题所谓的广搜加深搜只是用深搜找一条路径,而用广搜找另外一条路径,。根本不是我希望的广搜和深搜的结合。 不过既然题目已经看了,还是做一做吧。求最短路的没什么好说的,用一下广搜就可以解决问题了。主要是靠左走和靠右走的部分,这里用到了两个数组,dirx[],diry[],共同来确定方向。dirx[],diry[],数组的下标增1.
阅读全文

浙公网安备 33010602011771号