zoukankan      html  css  js  c++  java
  • Pick-up sticks--poj2653(判断两线段是否相交)

    http://poj.org/problem?id=2653

    题目大意:有n根各种长度的棍   一同洒在地上 求在最上面的棍子有那几个

    分析:  我刚开始想倒着遍历  因为n是100000   想着会超时吧  后来一看说  在上面的不会超过1000个 这就放心了 简单优化一下就过了

    最后一个肯定是在最上面的 让后从他的下一个开始  每一个跟他相交的都是在他下面的  下一次就直接不循环他了  

    但是一直wa   彻底懵逼了    

    后来看了学长博客  他是正这循环  只要有跟他相交的就跳出  然后我就正这便利了一下  竟然过了  神奇ing   !!!

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<math.h>
    #include<algorithm>
    #include<iostream>
    
    using namespace std;
    #define N 100050
    const double ESP = 1e-8;
    #define INF 0xffffffff
    int vis[N];
    struct Point
    {
        double x,y;
        Point (double x=0,double y=0):x(x),y(y) {}
        Point operator - (const Point &temp)const
        {
            return Point(x-temp.x,y-temp.y);
        }
        bool operator == (const Point &temp)const
        {
            return (fabs(temp.x-x)<ESP && fabs(temp.y-y)<ESP);
        }
    
        int operator * (const Point &temp)const
        {
            double t=(x*temp.y)-(y*temp.x);
            if(t>ESP)
                return 1;
            if(fabs(t)<ESP)
                return 0;
            return -1;
        }
    };
    
    struct node
    {
        Point A,B;
        node(Point A=0,Point B=0):A(A),B(B) {}
    };
    
    node a[N];
    Point p[N];
    int s[N];
    int main()
    {
        int n;
        while(scanf("%d",&n),n)
        {
            int b=0;
            double x1,x2,y1,y2;
            for(int i=1; i<=n; i++)
            {
                scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
                p[b++]=Point(x1,y1);
                p[b++]=Point(x2,y2);
                a[i]=node(p[b-2],p[b-1]);
            }
            memset(vis,0,sizeof(vis));
            memset(s,0,sizeof(s));
            b=0;
            for(int i=1;i<=n;i++)
            {
                int flag=0;
                for(int j=i+1;j<=n;j++)
                {
                    int k=abs((a[i].A-a[j].A)*(a[j].B-a[j].A)+(a[i].B-a[j].A)*(a[j].B-a[j].A));
                    int kk=abs((a[j].A-a[i].A)*(a[i].B-a[i].A)+(a[j].B-a[i].A)*(a[i].B-a[i].A));
                    if(kk==0 && k==0)
                    {
                        flag=1;
                        break;
                    }
                }
                if(flag==0)
                    s[b++]=i;
            }
            printf("Top sticks: ");
            if(b==1)
            {
                printf("%d.
    ",s[0]);
                continue;
            }
            for(int i=0; i<b-1; i++)
            {
                printf("%d, ",s[i]);
            }
            printf("%d.
    ",s[b-1]);
        }
        return 0;
    }
  • 相关阅读:
    PHP 小方法之 算生日
    PHP 小方法之 随机生成几位字符串
    PHP 小方法之 过滤参数
    PHP 小方法之 计算两个时间戳之间相差的日时分秒
    PHP 小方法之 仿百度蜘蛛采集
    PHP 小方法之 显示 今天 昨天 上周 上月 近三月 的时间
    PHP保留两位小数的几种方法
    mysql 常用命令(一)
    PHP数据库页面增删查
    PHP数据库登陆注册简单做法
  • 原文地址:https://www.cnblogs.com/linliu/p/5431834.html
Copyright © 2011-2022 走看看