POJ 2653 Pick-up sticks
题意:
n个棍子,一个一个扔,如果扔在了别的棍子上,也就是说和别的棍子相交了,那么和它相交的棍子就会消失,
求最后剩下的棍子的编号
输入
输入由若干个案例组成。每种情况下的数据以1<n<= 100000,本例的数量为开始。下面的n行各包含四个数字,这些数字是一个端点端点的平面坐标。木棍是按照Stan扔的 顺序排列的。你可以假设顶端不超过1000根。输入以n=0的情况结束。此案件不应处理。
输出
对于每一个输入案例,打印一行输出,列出示例中给出的格式的顶部分支。顶部的木棒应该按照它们的顺序排列。
右下方的图片说明了输入的第一个例子。
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.
题解:
倒着检查
选定一个木棍,将他与后面的木棍比较,相交则退出,如果一直未退出,则保留
虽然数据是100000,但最后留下的不超过1000,所以只有1000根会全部遍历
虽是O(n^2)但非常快
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<iostream> 5 #include<cmath> 6 using namespace std; 7 double x1[100001],x2[100001],y11[100001],y2[100001]; 8 int n; 9 bool exam(int i,int j) 10 { 11 double dx=x1[i]-x1[j],dy=y11[i]-y11[j]; 12 double px=x2[j]-x1[j],py=y2[j]-y11[j]; 13 double fx=x2[i]-x1[j],fy=y2[i]-y11[j]; 14 if ((dx*py-dy*px)*(px*fy-py*fx)<0) return 0; 15 dx=x1[j]-x1[i],dy=y11[j]-y11[i]; 16 px=x2[i]-x1[i],py=y2[i]-y11[i]; 17 fx=x2[j]-x1[i],fy=y2[j]-y11[i]; 18 if ((dx*py-dy*px)*(px*fy-py*fx)<0) return 0; 19 return 1; 20 } 21 int main() 22 {int i,j; 23 while (cin>>n&&n) 24 { 25 for (i=1;i<=n;i++) 26 { 27 scanf("%lf%lf%lf%lf",&x1[i],&y11[i],&x2[i],&y2[i]); 28 } 29 cout<<"Top sticks: "; 30 for (i=1;i<n;i++) 31 { 32 for (j=i+1;j<=n;j++) 33 { 34 if (exam(i,j)) 35 break; 36 } 37 if (j==n+1) 38 printf("%d, ",i); 39 } 40 printf("%d.\n",n); 41 } 42 }