Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 11329 | Accepted: 4247 |
Description
Input
Output
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. 题意:n个棍子,一个一个扔,如果扔在了别的棍子上,也就是说和别的棍子相交了,那么和它相交的棍子就会消失, 求最后剩下的棍子的编号 思路:一个一个遍历,但是倒着检查,如果它的上面有棍子,那么这根棍子就一定会消失,然后继续下一个棍子 ac代码:#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #define MAXN 101000 #define MOD 1000000007 #define LL long long #define INF 0xfffffff #define fab(a)(a)>0?(a):(-a) using namespace std; struct s { double x1,x2,y1,y2; }a[MAXN]; int v[MAXN]; double fun(s aa,double xx,double yy) { return (aa.x2-aa.x1)*(yy-aa.y1)-(xx-aa.x1)*(aa.y2-aa.y1); } int check(s A,s B)//检查相交 { if(max(A.x1,A.x2)<min(B.x1,B.x2)) return 0; if(max(B.x1,B.x2)<min(A.x1,A.x2)) return 0; if(max(A.y1,A.y2)<min(B.y1,B.y2)) return 0; if(max(B.y1,B.y2)<min(A.y1,A.y2)) return 0; if(fun(B,A.x1,A.y1)*fun(B,A.x2,A.y2)>=1e-10) return 0; if(fun(A,B.x1,B.y1)*fun(A,B.x2,B.y2)>=1e-10) return 0; return 1; } int main() { int n,i,j; while(scanf("%d",&n)!=EOF,n) { memset(v,0,sizeof(v)); for(i=1;i<=n;i++) { scanf("%lf%lf%lf%lf",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2); } printf("Top sticks: "); for(i=1;i<n;i++) { for(j=i+1;j<=n;j++)//倒着检查 { if(check(a[i],a[j])) { break; } } if(j==n+1) printf("%d, ",i); } printf("%d.\n",n); } return 0; }