关键:过同一直线上的点均满足直线方程,所以枚举每种直线时点的分布情况其实就是看点是否满足方程,而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;
}