两条斜线

链接:https://ac.nowcoder.com/acm/problem/18951
来源:牛客网

题目描述

平面上有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)四个点都可以被经过

#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);
}

解题过程:基础不好,我是看别人写的,然后理解了在默写一遍,先用两个数组记录经过每个点的直线,在减去两个直线的相交直线

感悟:先练习枚举,将思路编程代码,在去练习别的算法

原文地址:https://www.cnblogs.com/pppyyyzzz/p/11579805.html