摘要:
3384 -- Feng Shui 构造半平面交,然后求凸包上最远点对。 这题的题意是给出一个凸多边形区域,要求在其中放置两个半径为r的圆(不能超出凸多边形区域),要求求出两个圆心,使得多边形中没有被覆盖的面积最小。反之就是求圆覆盖的区域最大。首先我们可以求出圆心放置的位置的区域,这个要利用半平面交,将原多边形区域向内收缩r的距离。要求两个圆覆盖的区域最大,也就是它们相交的面积最小,也就是两个圆心的距离要尽可能的大。这样就说明了,这题的做法是要求出凸包上面的最远点对。 做这题的时候犯了两个错误,一个是没有设置对精度,直接用了cout的默认输出,另一个则是没有想到收缩以后,剩余的多边形的顶... 阅读全文
摘要:
Problem - 2986 之前在华工赛见过的一道简单的模拟,用map轻松干掉。为了精确,要全程用整型比较。轻松1y~代码如下: 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <string> 6 #include <map> 7 8 using namespace std; 9 10 map<string, int> val;11 12 int con(char 阅读全文
摘要:
Problem - 4430 题意是,给出蜡烛的数量,要求求出r和k,r是蜡烛的层数,k是每一层蜡烛数目的底数。 开始的时候,没有看清题目,其实中间的那根蜡烛是可放可不放的。假设放置中间的那根蜡烛,就可以用等比数列求和公式S=(k^(r+1)-1)/(k-1),因为这个公式,对于固定的r,S(k)是单调递增的,然后可以发现,r的范围是相当的小的,最多不会大于40,然后就可以对于每一个r进行一次二分查找,找到k。但是,对于r==1的时候,用这个公式的是会爆龙龙的,而r==1的时候又是直接可以计算出来的,所以留到之后再算。另外,求的是r*k最小的结果,其实很容易发现,r是越大越好的,所以就从大.. 阅读全文
摘要:
Problem - 3374KMP求循环节。http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html 循环节推导的证明相当的好,这题是很裸的套算法的题。代码如下: 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 const int N = 1111111; 9 char buf[N];10 int next[N];11 12 void getNext(char *str) {13 char *si = str;... 阅读全文
摘要:
Jan's LightOJ :: Problem 1285 - Drawing Simple Polygon 搞了挺久的一道题,通过率挺低的。 题意是,给出一堆点,要求求出一个多边形,多边形上每一条边不与其他的边相交,而且多边形要用给出的所有点。如果能构成多边形,就输出多边形的点的序号,否则就输出"Impossible"。 做法是,对所有的点做凸包,每次做出凸包后对剩余的点继续做凸包,直到的到很多个一层包含一层的凸包。然后剩下的操作就是模拟相邻两层间的连结了。对于我代码中注释的第一组数据:对所有的点做凸包后:然后模拟遍历各个凸包的做法:其实很容易可以发现,对于每一个 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=3007 前几天认真看了一下最小圆覆盖的论文,对于随机点集,只需要按顺序插入。每次插入分两种情况,一种是点在当前的圆中,另一种是点在园外。在圆中可以直接不理,在圆外的就要枚举所有构成最小覆盖圆的可能了。当发现点在圆外的时候,这个点必定是当前要找到的最小圆经过的点之一,于是就可以枚举出两个点和三个点的情况。看上去是一个O(n^3)的算法,但是对于随机的插入的点,剪枝可以使得复杂度降到期望的O(n)的规模。代码如下: 1 #include <cstdio> 2 #include <cmath> 阅读全文
摘要:
Jilin University Online Judge System--2785:赛车 吉林大学OJ上的题目。中文题。 这是经典的半平面交的模型。直接套用半平面交的模板,不过要注意,对有向直线排序的时候要用叉积来比较,不然精度会丢失,从而导致排序出错。代码如下: 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <cmath> 6 7 using namespace std; 8 9 co 阅读全文
摘要:
Problem - 2215 题意是,给出一些直径为1的树的位置,要求求出最小的能够把所有的树围起来的圆的半径。 开始的时候打算用类似模拟退火的方法,假定一个位置是最小圆的圆心,然后向每一个方向尝试移动圆心。如果能得到更小的一个圆,那么就将圆心移动到这里。如果把所有的方向都找遍都不能找到更小的圆,这时就要将点移动的距离减少,继续移动。直到移动的距离足够小的时候停止搜索。不过这样做,精度不能保证,所以最后还是要换回最小包围圈算法来通过这题。 下面的是包围圈暴力算法的代码,复杂度O(n^3): 1 #include <cstdio> 2 #include <cstring> 阅读全文
摘要:
Problem - 2202 题目中文,不另外解释。 做法是构造出凸包,估计点是随机出的,所以凸包的大小不会太大,于是可以直接对凸包上的点进行暴力计算三角形的面积。 如果随机的点是n个,凸包上面有m个点,那么复杂度就是O(n+m^3)。代码如下: 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #include <iostream> 6 7 using namespace std; 8 9 const double 阅读全文
摘要:
希望越大,失望越大。_(:з」∠)_ 但愿这一次的失败会是以后比赛的宝贵经验。沉潜,是为了下一次能跃 的更高! 早上,阴雨的天气,我们3个人6点多就醒来了。刷牙洗脸,然后就收拾好要带去赛场的物品。一切准备的是多么的好。可是我们3人早上的状态貌似都不怎么样,感觉不太好。 我们7点半就在酒店吃完早餐,然后就下去楼下坐车去赛场了。到达赛场的时候8点钟,场地还在布置着,所以我们只能在主席台上等候志愿者安排好一切。比赛前15分钟左右,我们进入了赛场,房号东西准备开打。 本来根据气球的颜色,预计ABC三题是大水题,结果开始的时候,他们看AB,我去开编译器。ly看了下B,没有认真看清就跟我说大概... 阅读全文