POJ 2653 Pick-up sticks 解题报告
时间:2010-05-13 来源:MC_ACM
Description
Stan has n sticks of various length. He throws them one at a time on the floor in a random way. After finishing throwing, Stan tries to find the top sticks, that is these sticks such that there is no stick on top of them. Stan has noticed that the last thrown stick is always on top but he wants to know all the sticks that are on top. Stan sticks are very, very thin such that their thickness can be neglected.
Input
Input consists of a number of cases. The data for each case start with 1 <= n <= 100000, the number of sticks for this case. The following n lines contain four numbers each, these numbers are the planar coordinates of the endpoints of one stick. The sticks are listed in the order in which Stan has thrown them. You may assume that there are no more than 1000 top sticks. The input is ended by the case with n=0. This case should not be processed.
Output
For each input case, print one line of output listing the top sticks in the format given in the sample. The top sticks should be listed in order in which they were thrown.
Sample Input
5
1 1 4 2
2 3 3 1
1 -2.0 8 4
1 4 8 2
3 3 6 -2.0
3
0 0 1 1
1 0 2 1
2 0 3 1
0
Sample Output
Top sticks: 2, 4, 5.
Top sticks: 1, 2, 3.
题目大意:给定一堆筷子,依次往下抛,给定筷子的两断点坐标,求哪些筷子在最上面(即那些筷子上面没有其他筷子压着)
思路:判断线段相交,用叉积。
设p=(x1,y1),q=(x2,y2),则pXq=x1*y2-x2*y1,若pXq为正数,则对于原点来说,p在q的顺时针方向上;若pXq为负数,则p在q的逆时针方向上。对于有公共断点的三条线段来说,设该三条线段的向量分别为p1,p2,p3,假设p2在p1的逆时针方向上,p3在p1的顺时针方向上,那么(p2Xp1)*(p3Xp1)必定小于0。
代码:
#include<stdio.h> |