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;
}