题目来源:https://www.nowcoder.com/question
思路
最初看这道题,并没有想到利用直线平行垂直去做,而是想到旋转和移动相互制约,然后枚举每一个点分别在x轴和y轴的时候(通过旋转),然后,遍历得出其余点的坐标的位置的最多的,一直这样,寻找最大值。。但是实现的时候,发现,需要求旋转角度,进而得出其余点在旋转了这么一个角度后的位置,,,,(捂脸)不会。。。
然后就看了下别人(大佬)的思路:
那,利用两点去确定一条直线,然后遍历其余点取一点,做一条垂线向之前那条直线,呈一个标准的十字架状,得到最大值,就可以了。
反思
思考问题要更加全面。
代码
#include<set>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
int n;
int X[60],Y[60];
int main()
{
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&X[i]);
for(int i=0; i<n; i++)
scanf("%d",&Y[i]);
int numMax=0,numCurrent=0;
if(n<=3)
{
printf("%d\n",n);
return 0;
}
for(int i=0; i<n; i++)
{
for(int j=i+1;j<n;j++)
{
int x1=X[j]-X[i];
int y1=Y[j]-Y[i];
for(int k=0;k<n;k++)
{
if(k==i||k==j) continue;
numCurrent=3;
for(int l=0;l<n;l++)
{
if(l==i||l==j||l==k) continue;
int x2=X[l]-X[k];
int y2=Y[l]-Y[k];
int x3=X[l]-X[i];
int y3=Y[l]-Y[i];
if(x1*x2+y1*y2==0||x1*y3==x3*y1)
numCurrent++;
}
if(numMax<numCurrent)
numMax=numCurrent;
}
}
}
printf("%d\n",numMax);
}