Benelux Algorithm Programming Contest 2016 Preliminary Target Practice

题意:

二维平面上若干个点,能否用两条直线,穿过所有的点

 

前3个点要么在同一直线上,要么在2条直线上

所以用前3个点里的任意两个点定好第一条直线

然后判断剩余所有的点是否在这条直线或另一条直线上

 

#include<cstdio>

using namespace std;

#define N 100001

int n,x[N],y[N];

bool solve(int a,int b,int c)
{
    long long x0=x[b]-x[a],y0=y[b]-y[a],x1,y1,x2,y2;
    bool tag=false;
    for(int i=1;i<=n;++i)
    {
        if(i==c || i==b || i==a) continue;
        x1=x[i]-x[a];
        y1=y[i]-y[a];
        if(x0*y1-x1*y0)
            if(!tag)
            {
                x2=x[c]-x[i];
                y2=y[c]-y[i];
                tag=true;
            }
            else
            {
                x1=x[c]-x[i];
                y1=y[c]-y[i];
                if(x1*y2-x2*y1) return false;
            }
    }
    return true;
}

int main()
{
//    freopen("bigsuccess3.in","r",stdin); 
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d%d",&x[i],&y[i]);
    if(n<=4)
    {
        printf("success");
        return 0;
    }
    int a,b,c=3;
    long long x0=x[1]-x[2],y0=y[1]-y[2],xx,yy;
    for(int i=3;i<=n;++i)
    {
        xx=x[i]-x[1];
        yy=y[i]-y[1];
        if(x0*yy-xx*y0)
        {
            c=i;
            break;
        }
    }
    a=1;
    b=2;
    if(solve(a,b,c) || solve(b,c,a) || solve(c,a,b)) printf("success");
    else printf("failure"); 
    return 0;
}

 

posted @ 2020-09-09 11:08  TRTTG  阅读(163)  评论(0编辑  收藏  举报