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