关键:过同一直线上的点均满足直线方程,所以枚举每种直线时点的分布情况其实就是看点是否满足方程,而k=1即是y-x=b(minus相同),k=-1即是y+x=b(sum相同),所以只要坐标满足和相同或者差相同则共线,这样就完全变成了x,y的一一枚举,所以有三层循环,分别是枚举和,差,以及每一个点对应的和差,时间复杂度O(n^^3);

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int a[2][1000];
    int num;
    cin>>num;
    for(int i=0;i<num;i++)
        cin>>a[0][i];
    for(int i=0;i<num;i++)
        cin>>a[1][i];
    int sum,minus,max_num=0;
    for(int i=0;i<num;i++)//枚举每一种和
    {
        sum=a[0][i]+a[1][i];
        for(int k=0;k<num;k++)//枚举每一种差
        {
            int number=0;
            minus=a[1][k]-a[0][k];
            for(int x=0;x<num;x++)//枚举每个坐标对应的和差
            {
                if(a[0][x]+a[1][x]==sum||a[1][x]-a[0][x]==minus)
                    number++;//判断是否满足方程,满足则该情况点数+1;
            }
            if(max_num<number)
                max_num=number;//若该情况点数大于之前最大则赋值给最大;
        }
    }
    cout<<max_num;
    return 0;
}