pku 1039 Pipe
这题的最优解在于最优直线至少会过两个拐点,枚举拐点对。
pku 1092 Farmland
总是是过了。这题有点像找凸包,不同的是凸包是以最左下点作为参考。首先对每个顶点的邻接点排序(按极角),以源点和顶点为参照边,从小到大排序其邻接点。通过排序后各顶点的邻接点按逆时针排列。下一步就是去找所以的封闭多边形,按着从一条边以该边为轴逆时针旋转到邻近的边,由于事先对邻接点排好了序,这是很容易做到的。另外对使用过的角标记,可以按起始边标记。这样总是逆时针旋转,最后就可以得到一个封闭的多边形,要注意到是满足k个顶点的多边形不一定在其内部没有其他点。通过旋转得到的多边形序列是一个顺时针的顶点序列,但是当多边形是凸包时,其序列是逆时针,所以在候选解中找一对相邻边判断下他们是否只顺时针关系,是的话就满足要求。
pku 1106 Transmitters
有两种方法可以,计算角度+枚举,或是计算叉积+枚举,后一种要简洁。
pku 1118 Lining Up
最多有多少个点共线,枚举每一点与另外的点的组成的直线的斜率,再排序斜率,找在同一直线上的点。适当的优化这样的
算法还是可以接受的。
pku 1375 Intervals
计算圆的切线,公式化简避免过多浮点运算,不然会出现精度问题。
pku 1410 Intersection
tblr
1010 | 1000 | 1001
-------|-------------|----------
| |
0010 | 0000 | 0001
| |
-------|-------------|----------
0110 | 0100 | 0101
sum=p1.r*p2.r+p1.l*p2.l+p1.t*p2.t+p1.b*p2.b。sum!=0线段在矩形外。否则,若p1或p2在矩形内,则线段和矩形相交。
最后剩下sum==0 p1!=0 p2!=0 ,通过线段和对角线的叉积判断线段是否分割角。
pku 1569 Myacm Triangles
这题数据量不大,我用枚举过的。判断点在三角形类是通过叉积计算面积。若点在三角形里三边和该点够成的三个三角形面积之和与这个三角形的面积相当,那这个点就是在三角形内了。
pku 1819 Disks
题目要求将圆向左边直到和其他圆相切或和y轴相切,在不影响总宽度的时候可以把前面的一些圆拿走。将一些不必要的
圆拿走后留下来的每个圆和只和前面一个圆相切。就是通过这一点来实现程序,每次加入一个圆c时就考虑将之前的一些圆拿走。找到最左边一个圆c0和圆c相切,c0右边的所有圆就可以都拿走了。最后就得到所有的圆之和前面的圆相切,最后要处理的情况就是左边有个很大的圆,在他的右边那些圆都是些小圆,他们不影响总宽度。只要记录下决定边界那个,把它右边的圆都拿走就可以了。
这题的最优解在于最优直线至少会过两个拐点,枚举拐点对。
pku 1092 Farmland
总是是过了。这题有点像找凸包,不同的是凸包是以最左下点作为参考。首先对每个顶点的邻接点排序(按极角),以源点和顶点为参照边,从小到大排序其邻接点。通过排序后各顶点的邻接点按逆时针排列。下一步就是去找所以的封闭多边形,按着从一条边以该边为轴逆时针旋转到邻近的边,由于事先对邻接点排好了序,这是很容易做到的。另外对使用过的角标记,可以按起始边标记。这样总是逆时针旋转,最后就可以得到一个封闭的多边形,要注意到是满足k个顶点的多边形不一定在其内部没有其他点。通过旋转得到的多边形序列是一个顺时针的顶点序列,但是当多边形是凸包时,其序列是逆时针,所以在候选解中找一对相邻边判断下他们是否只顺时针关系,是的话就满足要求。
pku 1106 Transmitters
有两种方法可以,计算角度+枚举,或是计算叉积+枚举,后一种要简洁。
pku 1118 Lining Up
最多有多少个点共线,枚举每一点与另外的点的组成的直线的斜率,再排序斜率,找在同一直线上的点。适当的优化这样的
算法还是可以接受的。
pku 1375 Intervals
计算圆的切线,公式化简避免过多浮点运算,不然会出现精度问题。
pku 1410 Intersection
tblr
1010 | 1000 | 1001
-------|-------------|----------
| |
0010 | 0000 | 0001
| |
-------|-------------|----------
0110 | 0100 | 0101
sum=p1.r*p2.r+p1.l*p2.l+p1.t*p2.t+p1.b*p2.b。sum!=0线段在矩形外。否则,若p1或p2在矩形内,则线段和矩形相交。
最后剩下sum==0 p1!=0 p2!=0 ,通过线段和对角线的叉积判断线段是否分割角。
pku 1569 Myacm Triangles
这题数据量不大,我用枚举过的。判断点在三角形类是通过叉积计算面积。若点在三角形里三边和该点够成的三个三角形面积之和与这个三角形的面积相当,那这个点就是在三角形内了。
pku 1819 Disks
题目要求将圆向左边直到和其他圆相切或和y轴相切,在不影响总宽度的时候可以把前面的一些圆拿走。将一些不必要的
圆拿走后留下来的每个圆和只和前面一个圆相切。就是通过这一点来实现程序,每次加入一个圆c时就考虑将之前的一些圆拿走。找到最左边一个圆c0和圆c相切,c0右边的所有圆就可以都拿走了。最后就得到所有的圆之和前面的圆相切,最后要处理的情况就是左边有个很大的圆,在他的右边那些圆都是些小圆,他们不影响总宽度。只要记录下决定边界那个,把它右边的圆都拿走就可以了。