最大高度差

Problem 3 : 最大高度差

(altitude.pas/ altitude.in/ altitude.out)

【问题描述】

    我们把一块山地划分为N x N的小块。你已经知道了每一块地的海拔高度。你需要回答若干个询问。一次询问指定了一块S x S的正方形区域(S是一个已经给定的值),你需要回答出在这个区域里最小海拔高度和最大海拔高度相差多少。

【输入数据】

    第一行输入三个用空格隔开的正整数n,s,k,表示山地的大小、一次询问的大小和询问的次数。输入数据保证s<=n。

    以下n行为一个N x N的矩阵,该矩阵描述了这个山地的高度情况。这些数字保证是不超过maxint的正整数。

    接下来k行每行两个数x,y,询问以第x行第y列的格子作为左上角的S x S的方格中最大的高度差。输入数据保证输入的x,y有意义。

【输出数据】

    对于每一个询问,输出询问的区域中高度差的最大值(每个询问的输出均独立占用一行)。

【样例输入】

5 3 1

5 1 2 6 3

1 3 5 2 7

7 2 4 6 1

9 9 8 6 5

0 6 9 3 9

1 2

【样例输出】

5

【样例说明】

    输入数据询问子矩阵:

    1 2 6

    3 5 2

    2 4 6

    的最大高度差是多少。

    答案为6-1=5。

【数据规模】

    对于30%的数据,n<=10,k<=10;

    对于50%的数据,n<=30,k<=100;

    对于100%的数据,n<=100,k<=1000。

模拟暴力即可。

#include<iostream>
using namespace std;

void in(int &x)
{
    int y=1;
    char c=getchar();x=0;
    while(c>'9'||c<'0')
    {
        if(c=='-')
        y=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    x=x*10+c-'0',c=getchar();
    x*=y;
}

void out(int x)
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x>9)out(x/10);
    putchar(x%10+'0');
}

int n,s,k;
int a[110][110];
int main()
{
    freopen("altitude.in","r",stdin);
    freopen("altitude.out","w",stdout);
    in(n),in(s),in(k);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        in(a[i][j]);
    int x,y;
    int Min,Max;
    for(int t=1;t<=k;t++)
    {
        Min=0xf77777777;
        Max=0;
        in(x),in(y);
        for(int i=x;i<x+s;i++)
          for(int j=y;j<y+s;j++)
            {
                Max=max(Max,a[i][j]);
                Min=min(Min,a[i][j]);
            }
        out(Max-Min),putchar('
');
    }
    return 0;
}
原文地址:https://www.cnblogs.com/war1111/p/7500500.html