题目描述
平面上有n个点,现在你需要建造两条路
一条是斜率为1,另一条斜率为-1
你的任务是让这两条路经过尽可能多的点
求最多经过几个点
输入描述
第一行输入一个整数n
第二行输入n个整数表示x坐标
第三行输入n个整数表示y坐标
数据保证没有重点
1 ≤ N ≤ 1000,0 ≤ x[i],y[i] ≤ 999
输出描述
输出一个整数
示例1
输入
4
1 4 4 5
3 0 2 3
输出
4
示例2
输入
6
0 1 2 3 4 5
2 2 2 2 2 2
输出
2
示例3
输入
4
2 2 3 3
2 3 2 3
输出
4
分析
暴力枚举
将两条路类比为两条直线
每个点都可能在斜率k为1或-1的线上,将所有可能列举出
来,再计算出每种可能线上点的总数,经过比较可得出点的最大数目。判断点是否在线上的条件:斜率为1的线上x + y 为定值,斜率为-1的线上x - y 为定值。
#include <iostream>
using namespace std;
typedef
struct Point
{
int x;
int y;
int sum; //记录x+y
int des; //记录x-y
}Point;
int main()
{
int n;
cin >> n;
Point p[n];
for(int i = 0; i < n; ++i)
{
cin >> p[i].x;
}
for(int i = 0; i < n; ++i)
{
cin >> p[i].y;
p[i].sum = p[i].x + p[i].y;
p[i].des = p[i].x - p[i].y;
}
int max = 0;
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n; ++j) // 枚举出所有可能
{
int s = 0;
for(int k = 0; k < n; ++k)
{
if(p[k].sum == p[i].sum || p[k].des == p[j].des) //判断点是否在线上
++s;
}
if(s > max)
max = s;
}
}
cout << max;
return 0;
}