• 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;
    }
    
  • 相关阅读:
    woj 1574
    UESTC 594 我要长高 dp单调队列
    HDU 3401 Trade dp 单调队列优化
    HDU 2844 Coins 多重背包
    2-1
    1-2
    1-1
    12-1
    9-1
    14-8
  • 原文地址:https://www.cnblogs.com/jasony/p/13738036.html
Copyright © 2020-2023  润新知