zoukankan      html  css  js  c++  java
  • POJ2653判断线段相交

    POJ2653

    题目大意:按顺序放木棒,问最后所有的木棒中上面没有木棒的木棒的索引是……

    思路:按理说线段相交的题目做的听多了,这个应该不算新鲜,但是这个题,还是让我学到了认真读题,面对这个题很容易想到对于新输入的一根木棒,遍历它前面所有的木棒,判断是否有重合的有的话,把那个被重合木棒的索引标记好,这样是很好的但是两层循环就差不多是1e5 * (1 ~ 1e5)的复杂度了,所以看题看题:题目说,最后符合要求的木棒m < 1e3 ,就代表我们第二个循环可以是(1~ 1e3)的操作(前提,数据不算太暴力),所以,我们就可以记录索引,如果发现一个木棒已经作废,那我们就可以代替它,把新的木棒加到它的位置~~

    code~~

    正常的准备

    #include <iostream>
    #include <algorithm>
    #include <vector>
    #define eps 1e-10
    using namespace std;
    const int maxn = 1e5 + 1e2;
    const int maxm = 1e3 + 1e2;
    
    struct Point
    {
        double x,y;
        Point(double x = 0.0,double y = 0.0):x(x),y(y){}
    
        Point operator - (Point p){return Point(x - p.x,y - p.y);}
    };
    struct segment
    {
        Point p1,p2;
    
        segment (Point p1 = Point(0.0,0.0),Point p2 = Point(0.0,0.0)):p1(p1),p2(p2){}
    }lset[maxn];
    double cross(Point p0,Point p1,Point p2)
    {
        Point a = p1 - p0;
        Point b = p2 - p0;
        return a.x * b.y - b.x * a.y;
    }
    vector<int> ans;
    

     线段相交的判断

    bool interset(segment s1,segment s2)
    {
        int flag = 0;
        if(cross(s1.p1,s1.p2,s2.p1) * cross(s1.p1,s1.p2,s2.p2) < eps)flag++;
        if(cross(s2.p1,s2.p2,s1.p1) * cross(s2.p1,s2.p2,s1.p2) < eps)flag++;
        if(flag == 2)return true;
        return false;
    }
    

     main函数

    int main()
    {
        int n;
        double x1,y1,x2,y2;
        while(~scanf("%d",&n),n)
        {
            ans.clear();
            for(int i = 1;i <= n;i++)
            {
                scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
                lset[i] = segment(Point(x1,y1),Point(x2,y2));
                int idx = -1;
                for(int j = 0;j < ans.size();j++)
                {
                    if(ans[j] == -1)idx = j;
                    else if(interset(lset[i],lset[ans[j]]))ans[j] = -1;
                }
                if(idx != -1)ans[idx] = i;
                else ans.push_back(i);
            }
            sort(ans.begin(),ans.end());
            printf("Top sticks: ");
            for(int i = 0;i < ans.size() - 1;i++)
            {
                if(ans[i] != -1)printf("%d, ",ans[i]);
            }
            printf("%d.
    ", ans[ans.size() - 1]);
        }
        return 0;
    }
    

     idx就是待寻找的索引,初始化为-1也就是一个flag标志,不是-1代表有可替代的木棒,最后需要费时间排序一下

    越来越喜欢模块化编程了,特别是自己打出来的代码,不整齐,不模块化,反而很不舒服,以前我还是一main到底,这就是进步吧,加油~

  • 相关阅读:
    大数据时代之hadoop(一):hadoop安装
    求二叉树的镜像
    Python爬虫(一):基本概念
    汉字转拼音(不带音调)
    通过java类文件识别JDK编译版本号
    单机服务器支持千万级并发长连接的压力测试
    利用ansible来做tomcat应用的持续交付
    使用squid配置透明代理并对上网行为进行控制
    Linux最大文件句柄(文件描述符)限制和修改
    CentOS7.3 部署Haproxy 1.7.2
  • 原文地址:https://www.cnblogs.com/DF-yimeng/p/8543495.html
Copyright © 2011-2022 走看看