• 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;
    }
  • 相关阅读:
    无题..
    让Windows 2003 Server支持ASP程序
    下雪
    比较经典的.NET基础
    XML几种操作
    某年某月有几天
    .NET操作Word(傻瓜型)
    XML 简单操作
    一首歌
    ASP.NET:掌握Web窗体的生命周期与状态管理(摘自网络)
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5176745.html
Copyright © 2020-2023  润新知