链接:https://ac.nowcoder.com/acm/problem/18951
来源:牛客网
题目描述
平面上有n个点,现在你需要建造两条路,一条是斜率为1,
另一条斜率为-1
你的任务是让这两条路经过尽可能多的点
求最多经过几个点
另一条斜率为-1
你的任务是让这两条路经过尽可能多的点
求最多经过几个点
输入描述:
第一行输入一个整数N表示点的个数
第二行输入N个数表示X坐标
第三行输入N个数表示Y坐标
1<=N<=1000 ,0<=x[i],y[i]<=999
输出描述:
输出一个整数
示例1
说明
(1,3) (4,0) (4,2) (5,3)四个点都可以被经过
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<cmath> using namespace std; int x[1000], y[1000]; int k1[2100] = { 0 }, k2[2100] = {0},k3[5000][5000] = { 0 }; int main() { int N,m=0; 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]); for (int i = 0; i < N; i++) { k1[x[i] + y[i]]++; k2[x[i] - y[i] + 1000]++; k3[x[i] + y[i]][x[i] - y[i] + 1000]++;//记录两条直线经过相同的点个数 } for(int i=0;i<=2000;i++) for (int j = 0; j <= 2000; j++) { m = max(m, k1[i]+k2[j]-k3[i][j]); } printf("%d",m); }
解题过程:基础不好,我是看别人写的,然后理解了在默写一遍,先用两个数组记录经过每个点的直线,在减去两个直线的相交直线
感悟:先练习枚举,将思路编程代码,在去练习别的算法