随笔分类 - 几何
摘要:题意:给定一个点,一个圆,以及一个矩形,现在问从一个点到一个圆再到一个矩形的最短距离为多少?到达一个目标可以只挨着或者穿过它。解法:目前只知道从一个点到圆上按照[0,PI],[PI,2*PI]的两个半圆进行划分确实是满足距离是一个凹函数,但是加上到矩形的距离后仍然满足三分性质则不知道怎么得到的。具体做法是先将整个坐标系平移使得圆心落在(0, 0)处,然后三分枚举圆上的点,距离由两部分组成,一部分是点到圆上点的距离,一部分是点到矩形的距离,后者转化为点到四条线段的距离求解。代码如下:#include <cstdlib>#include <cstring>#include
阅读全文
摘要:题意:下图给定边长L和旋转角度a,求重叠之后的面积。解法:由于紫色的角已知是45度,加上a已知,可以推出phi等于a,设红色边长度为x,有x+x*cos(a)+x*sin(a) = L,根据公式得到x = L / (1+cos(a)+cos(a)),由于四个多出来三角形面积和形状都相同,因此重合的面积为L*L - 1/2 * x*cos(a) * x*sin(a) * 4 = L*L - x*x*sin(2*a)。代码如下:#include <iostream>#include <cstring>#include <cstdlib>#include <
阅读全文
摘要:题意:在一个矩形平面内,有若干道墙,现求从左部某一点到右部某一点的最短路径。解法:有一个事实是线路一定是从门两边的点上通过的,不可能出现从中间穿过的可能。因此我们就枚举两两点之间是否可达,这里就要使用到线段相交的判定。构好图之后就是一个spfa搞定。代码如下:#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>using namespace std;int N;struct Wall { double x,
阅读全文
摘要:这题也算是技巧性较强的一题,这题与上一题HDU-4311唯一的不同分出了八个方向,而且这八个方向没有上题那么和谐了,有四个方向的曼哈顿距离不再是1,也就是说题中所给定的逻辑距离在曼哈顿距离上没有了的体现,不过如果你数学素养好的话,有一个距离叫做切比雪夫距离 D = max(|x1-x2|, |y1-y2|),可以发现虽然曼哈顿距离有了改变,但是切比雪夫还是帮助我们找到了共同点,因为从一个点到另外一个点我们始终会先选择走斜线,一单位斜线相距离当于两单位曼哈顿距离,之所以只取最大值,是因为小的一部分曼哈顿距离我们可以通过斜线来消掉。如果数据量不大的话,我们就可以根据这个方法直接暴力了,但这好像对这
阅读全文
摘要:该题题义是有一个显示器,在给定了一系列的操作后,询问最后显示器所显示的区域。对于每个操作,给定一个x坐标和一个y坐标,以及三角形(等腰直角三角形)的边长。对于每个面积覆盖次数为奇数的区域是显示的,对于覆盖了0次或偶数次的区域是不显示的。那么我们可以将题目这样进行转化,我们规定了个三角形的区域,它的横纵坐标分别是x, y,边长为 r 那么这个三角形可以用一个方程组来表示,令 ci = xi + yi + r, x + y <= ci; x >= xi; y >= yi;这个图形画出来就是一个三角形区域,对于后面进来的三角形,我们同样可以写出这样一个方程,我们需要解出这两个方程组
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1006 在参考了0o恋蓝o0在Discuss中所说后,总算把这一题给弄懂了。题目要求:给定一个角度,问一天中时钟上的三根指针的夹角都大于等于该夹角的总时间占一天总时间的百分比。 思路:1、求出两两指针的相对较速度。 2、然后根据这个相对角速度求出两两之间的周期(即第一次重合到第二次重合所花的时间)。 3、计算出符合角度要求的两指针第一次满足和第一次不满足的时间。 4、在三个时间段上加上各自的周期,再取他们的交集即可。 代码如下:#include <cstdio>#include <cstri
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3952 这是一道计算几何的题目,刚好昨晚看了一下基本的计算几何,而这题就是叉积的应用。 设有两个共起点向量 A,B, 其中 A = { x1, y1 }, B = { x2, y2 }; A X B = x1 * y2 + x2 * y1; 如果 A X B > 0, 那么说明A向量在B向量的顺时针方向,反之则说明A在B的逆时针方向。等于零,说明两个向量重合。 那么对于某一点,就可以运用这一点来判定该点是在线段的左还是右了,即选择一个端点,再连接这个端点和所求的一点,构造出另一个向量.........
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4033 题中给定某一点到N个点的距离,问这些点能否组成正多边形? 思路:选定两条边,通过二分法枚举某一条边的边长,算出该边长下对应的中心角,然后再依据此边计算出其余三角形对应的中心角,最后看总的角度是否为360度。 代码如下: #include <cstdio>#include <cstring>#include <cmath>using namespace std;double e[200];const double PI = 4 * atan( double( 1 )
阅读全文