zoukankan      html  css  js  c++  java
  • CodeForces 618C CodeForces 618C

    第一反应是在凸包上随便找一条边,然后找剩下n-2个点里面距离这条边最短的一个点,这三点就构成了符合要求的三角形。。然而。。精度被卡死。

    换种思路,随便找两个点P1,P2,找剩下n-2个点中哪一个点与P1,P2形成的三角形面积最小,这三点构成了符合要求的三角形,然而我没写。。

    最终这样写的,按X,Y进行排序,相邻三个判断是否三点共线即可

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    const int maxn=100000+10;
    vector<int>v[maxn];
    struct point
    {
        int px,y;
        int x;
        int id;
    }p[maxn];
    int n;
    int lshx[maxn];
    
    bool cmp(const point&a,const point&b)
    {
        if(a.px==b.px) return a.y<b.y;
        return a.px<b.px;
    }
    
    bool cmp1(const point&a,const point&b)
    {
        return a.id<b.id;
    }
    
    long long multiply(point sp,point ep,point op)
    {
        long long a=(long long)(sp.px-op.px);
        long long b=(long long)(ep.y-op.y);
        long long c=(long long)(ep.px-op.px);
        long long d=(long long)(sp.y-op.y);
    
        return a*b-c*d;
    }
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&p[i].px,&p[i].y);
            p[i].id=i;
        }
        sort(p+1,p+1+n,cmp);
        int tot=1;
        p[1].x=tot;
        for(int i=2;i<=n;i++)
        {
            if(p[i].px==p[i-1].px) p[i].x=p[i-1].x;
            else
            {
                tot++;
                p[i].x=tot;
            }
        }
    
    
    
        for(int i=1;i<=n;i++) v[p[i].x].push_back(p[i].id);
        sort(p+1,p+1+n,cmp1);
        if(v[1].size()>=2)
        {
            printf("%d %d ",v[1][0],v[1][1]);
            printf("%d
    ",v[2][0]);
        }
        else if(v[2].size()>=2)
        {
            printf("%d ",v[1][0]);
            printf("%d %d
    ",v[2][0],v[2][1]);
        }
        else
        {
            for(int i=3;i<=tot;i++)
            {
                if(v[i].size()>=2)
                {
                    printf("%d ",v[i-1][0]);
                    printf("%d %d
    ",v[i][0],v[i][1]);
                    break;
                }
                else
                {
                    if(multiply(p[v[i][0]],p[v[i-1][0]],p[v[i-2][0]])==0) continue;
                    else
                    {
                        printf("%d %d %d
    ",v[i][0],v[i-1][0],v[i-2][0]);
                        break;
                    }
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    jquery--blur()事件,在页面加载时自动获取焦点
    jquery三级联动
    工具集
    兼容各个浏览器:禁止鼠标选择文字事件
    jquery 事件委托(利用冒泡)
    小功能1:多种方法实现网页加载进度条
    JavaSE| 泛型
    SSM整合
    Redis数据库 02事务| 持久化| 主从复制| 集群
    Hadoop| MapperReduce02 框架原理
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5176745.html
Copyright © 2011-2022 走看看