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 }

 

 
posted @ 2017-08-01 14:10  Z-Y-Y-S  阅读(315)  评论(0编辑  收藏  举报