CF849B Tell Your World 题解

题意

平面上有 \(n\) 个点,第 \(i\) 个点的坐标是 $( i , y[ i ] ) $ 。问是否能找到两条不重合的平行线,使这 \(n\) 个点都在这两条平行线上。

分析

两点确定一条直线,再加一个点就能确定一对平行线。只需选前三个点中的任意 \(2\) 个点,形成 \(3\) 条直线,再枚举剩下的点是否在这条直线上或在它的同一条平行线上。

代码

#include <bits/stdc++.h>
#define elif else if
using namespace std;
int T,n;
vector<int>y;
bool check(double k)
{
    bool flag=false;
    int x=-1;
    for(int i=2;i<=n;i++)
    {
        if(y[i]-y[1]==k*(i-1)) continue; // 在这条直线上
        flag=true;
        if(x==-1) x=i; // 如果之前没有点在这条直线的平行线上,就记录这个点
        elif((y[i]-y[x])!=k*(i-x)) // 这个点既不在这条直线上,也不在它的平行线上
        {
            flag=false;
            break;
        }
    }
    return flag;
}
int main()
{
    scanf("%d",&n);
    int i,j;
    y.push_back(0);
    for(i=0;i<n;i++)
    {
        int x;
        scanf("%d",&x);
        y.push_back(x);
    }
    double a1=double(y[2]-y[1]); // 分别计算3条直线的斜率
    double a2=double((y[3]-y[1])*0.5);
    double a3=double(y[3]-y[2]);
    if(check(a1)||check(a2)||check(a3)) // 分别枚举三条直线
    {
        printf("Yes\n");
    }
    else printf("No\n");
    return 0;
}
posted @ 2022-02-18 11:16  l_x_y  阅读(34)  评论(0编辑  收藏  举报