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;
    }
  • 相关阅读:
    止步于磁盘空间不足
    添加随机扰动 爬山算法
    递归 启发式
    删除文件
    linux 下载 图片
    CURD特性
    php 写session
    php 写session
    14.5.4 InnoDB File-Per-Table Tablespaces 每个表一个文件
    14.5.4 InnoDB File-Per-Table Tablespaces 每个表一个文件
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5176745.html
Copyright © 2011-2022 走看看