牛客NC18951
题目描述
平面上有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
说明
(1,3) (4,0) (4,2) (5,3)四个点都可以被经过。
原文链接:https://blog.csdn.net/m0_52949684/article/details/122511915
上面是csdn博主的题解。下面是我根据他的题解做出的自己的理解。供自己参考。
#include <iostream>
#include <cmath>
using namespace std;
/*
思路:通过y = (1)/(-1)x + b中的b来确定直线
如果y - x 或者y + x得到的b相同,那么这些点就在同一条直线上
*/
int x[1000], y[1000];
int n;
int main()
{
cin >> n;
int max1 = 0; //求最大经过点数
for(int i = 0; i < n; i++) cin >> x[i];
for(int i = 0; i < n; i++) cin >> y[i];
for(int i = 0; i < n; i++) //更换下一个b1
{
int b1 = y[i] - x[i]; //确定b1这个直线
for(int j = 0; j < n; j++) //更换下一个b2
{
int cnt = 0; //在更新总点数的循环外面更新cnt
int b2 = y[j] + x[j]; //确定b2这个直线
for(int k = 0; k < n; k++)
{ //循环整个数组,如果有符合这两条线的点,cnt++
if(y[k] + x[k] == b2 || y[k] - x[k] == b1) cnt++;
}
max1 = max(max1, cnt); //更新最大值
}
}
cout << max1;
return 0;
}