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(‘\n‘); } return 0; }
时间: 2024-10-09 21:16:04