CF849B Tell Your World

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;
}
原文地址:https://www.cnblogs.com/jasony/p/13738036.html