poj 2653 Pick-up sticks【线段相交】



点击打开链接



题意:


        依次向地上仍n个棍子(按先后顺序),后仍的如果和前面已经扔过的有交点,那么会叠加上去,

        题目问最后最上面的木棍有哪些。


题解:


        从前向后判断每个木棒上面有没有其他木棒,有的话,直接break。

        否则tle。


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
//#include<pair>
#include<cmath>
#include<vector>
#define x first
#define y second
using namespace std;
inline int read(){int x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar())
if(c=='-')f=-1;for(;isdigit(c);c=getchar())x=x*10+c-'0';return x*f;}
const double eps=1e-8;
const double PI=acos(-1.0);
const int maxn=1e5+10;
int sgn(double x){
    if(fabs(x)<eps) return 0;
    if(x<0) return -1;
    return 1;
}
struct Point{
    double x,y;
    Point(){}
    Point(double _x,double _y){
        x=_x;y=_y;
    }
    Point operator -(const Point &b)const{
        return Point(x-b.x,y-b.y);
    }
    double operator ^ (const Point &b)const{
        return x*b.y - y*b.x;
    }
};
struct Line{
    Point s,e;
    Line(){}
    Line(Point _s,Point _e){
        s=_s;e=_e;
    }
};
bool inter(Line l1,Line l2){
    return
    max(l1.s.x,l1.e.x)>=min(l2.s.x,l2.e.x)&&
    max(l2.s.x,l2.e.x)>=min(l1.s.x,l1.e.x)&&
    max(l1.s.y,l1.e.y)>=min(l2.s.y,l2.e.y)&&
    max(l2.s.y,l2.e.y)>=min(l1.s.y,l1.e.y)&&
    sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e))<=0&&
    sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e))<=0;
}
Point p1,p2,p3,p4;
Line l[maxn],t1;
bool v[maxn];
vector<int>vec;
int main(){
    int n,cnt;
    double x1,x2,y2,y1;
    while(scanf("%d",&n)&&n){
        memset(v,0,sizeof(v));
        vec.clear();
        for(int i=1;i<=n;++i){
            scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
            //x1=read();y1=read();x2=read();y2=read();
            p1={x1,y1};p2={x2,y2};
            l[i]={p1,p2};
        }
        for(int i=1;i<=n;++i){
            for(int j=i+1;j<=n;++j){
                if(inter(l[i],l[j])){
                    v[i]=true;
                    break;
                }
            }
        }
        printf("Top sticks: ");
        int f=0;
        for(int i=1;i<=n;++i)
            if(!v[i]){
                if(!f)printf("%d",i),f=1;
                else printf(", %d",i);
            }
        puts(".");

    }
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值