题意:
将n根木棍依次随机抛在平面上,求出没有木棍压在该木棍上的木棍编号。
图示:
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.
思路:
1.最后一根木棍一定没有木棍压在上面
2.从第一根木棍开始遍历,直到n-1跟木棍,判断每一根木棍与后面的木棍是否有交。
输出没有交点的木棍编号。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=200010;
struct Point{
double x,y;
Point(double x=0,double y=0):x(x),y(y){}
};
typedef Point Vector;
Point dt[N];
Vector operator - (Point a,Point b){return Vector(a.x-b.x,a.y-b.y);}
double Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;}
int main(){
int n,k,j;
while(scanf("%d",&n),n){
k=0;
for(int i=1;i<=n;i++)
scanf("%lf%lf%lf%lf",&dt[i].x,&dt[i].y,&dt[i+n].x,&dt[i+n].y);
printf("Top sticks: ");
for(int i=1;i<n;i++){
for(j=i+1;j<=n;j++){
if(Cross(dt[i]-dt[j],dt[i]-dt[j+n])*Cross(dt[i+n]-dt[j],dt[i+n]-dt[j+n])<=0)
if(Cross(dt[j]-dt[i],dt[j]-dt[i+n])*Cross(dt[j+n]-dt[i],dt[j+n]-dt[i+n])<=0)
break;
}
if(j==n+1)printf("%d, ",i);
}
printf("%d.\n",n);
}
return 0;
}