矩形-洛谷-P1369

原题
给出平面上的n个点,请找出一个边与坐标轴平行的矩形,使得它的边界上有尽量多的点
输入输出格式
输入格式:
第一行一个整数n,为平面内点的个数。
第2~n+1行每行两个整数,为点的横、纵坐标。
输出格式:
只有一个数,为所取矩形边界上能包含尽量多的点的个数。
输入输出样例
输入样例#1:
10
2 3
9 2
7 4
3 4
5 7
1 5
10 4
10 6
11 4
4 6
输出样例#1:
7
说明
【数据范围】
n<=300,各点的横、纵坐标在1~100范围内
题意:
就是给你n个二维坐标,要求你找一个矩形要求边与坐标轴平行或垂直。问找到一个能够包含最多点数的矩形,并输出最多的点数。
题解:
这道题,如果数据大了就不好处理了,但是这道题目数据很小,直接暴力枚举就好了,用了一点前缀和的知识,总体上是一道水题。
解题思路大致是,我们用一个sum【】【】二维数组来储存每一个点的左上方的点数,之后枚举每一个符合题意的矩形,矩形边上的点数就是矩形整体的点数减去矩形内部的点数,输出最大的点数即可。
附上AC代码:

#include <iostream>
#include <algorithm>
using namespace std;
int n,sum[105][105],res,ans=0;
int sm(int i,int j,int k,int l)
{
    int s;
    if(i>=k||j>=l)
        return 0;
    else
        s=sum[k][l]+sum[i-1][j-1]-sum[k][j-1]-sum[i-1][l];
    return s;
}
int main()
{
    int X,Y,x=0,y=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>X>>Y;
        x=X>x?X:x;
        y=Y>y?Y:y;
        sum[X][Y]=1;
    }
    for(int i=1;i<=x;i++)
        for(int j=1;j<=y;j++)
    {
        sum[i][j]=sum[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
    }
    int i,j,k,l;
    for(i=1;i<=x;i++)
        for(j=1;j<=y;j++)
            for(k=2;k<=x;k++)
                for(l=2;l<=y;l++)
    {
        if(i>=k||j>=l)
            continue;
        res=sm(i,j,k,l);
        res=res-sm(i+1,j+1,k-1,l-1);
        ans=ans<res?res:ans;
    }
    cout <<ans<< endl;
    return 0;
}

欢迎评论!

猜你喜欢

转载自blog.csdn.net/wjl_zyl_1314/article/details/82932879