Solution
我们可以想到构造三条基准线: (k_{1,2},k_{2,3},k_{1,3}) ,分别以 (a_1,a_2) ,(a_2,a_3) 和 (a_1,a_3) 为线上的点,然后去判断剩下的点是否是在另一条与某一条基准线平行的线上。
代码
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
double a[N];
int n;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+(ch^48);ch=getchar();}
return x*f;
}
inline int solve(double k){
int flag=0,point=-1;
for(int i=2;i<=n;i++){
if(a[i]-a[1]==k*(i-1)) continue;//可能这条平行线有1
flag=1;
if(point<0) point=i;//没有1就记录点
else if(a[i]-a[point]!=k*(i-point)){
flag=0;//还不行就真不行了
break;
}
}
if(flag==1) return 1;
else return 0;
}
int main(){
n=read();
for(int i=1;i<=n;i++)
a[i]=read();
double k1=a[2]-a[1],k2=a[3]-a[2],k3=(a[3]-a[1])/2;
if(solve(k1)||solve(k2)||solve(k3)) puts("Yes");
else puts("No");
return 0;
}