codeforces 849B Tell Your World(计算几何)

来源:互联网 发布:淘宝的优质网店 编辑:程序博客网 时间:2024/05/29 09:38

题意:

给你一个直角坐标系,上面有n个点,问你能不能画两条不重合的平行线,使得每条平行线至少经过一个点,且所有的点都在其中一条平行线上。

思路:

提取前三个点,根据题目要求,这两条线其中一条必经过前三个点中至少两个点。所以可以枚举第一条平行线,找有没有符合条件的另一条平行线。

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;double arr[1001];int pd[1001];int n;bool solve(int x1,int x2){    memset(pd,0,sizeof(pd));    pd[x1] = 1;    pd[x2] = 1;    double xl = (arr[x1]-arr[x2])/(x1-x2);    bool flag = false;    for(int i = 1;i<=n;i++)    {        if(pd[i]==0)        {            double xxl = (arr[i]-arr[x1])/(i-x1);            if(xl==xxl)                pd[i] = 1;        }    }    int num = 0;    int pos;    double xll;    for(int i = 1;i<=n;i++)    {        if(pd[i]==0)        {            flag = true;            if(num==0)            {                pos = i;                num++;            }            else if(num==1)            {                xll = (arr[i]-arr[pos])/(i-pos);                if(xll!=xl)                    return false;                num++;            }            else            {                double xxl = (arr[i]-arr[pos])/(i-pos);                if(xxl!=xll)                    return false;            }        }    }    return flag;}int main(){    scanf("%d",&n);    for(int i = 1;i<=n;i++)        scanf("%lf",arr+i);    if(solve(1,2)||solve(1,3)||solve(2,3))        printf("Yes");    else        printf("No");    return 0;}

原创粉丝点击