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

题意:

给你一个直角坐标系,上面有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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值