首页 > 代码库 > 地形图

地形图

【题目描述】

地形图可通过一个高度矩阵表示,矩阵中每一个位置都有一个数hij(0 <= hij <= 105)表示这个坐标的海拔,称为海拔图。

现已知主视图、左视图,询问可能的体积的最大值和最小值。

【输入描述】

第一行输入两个数n、m,分别表示海拔图的长和宽;

第二行输入n个数,表示主视图上每一个位置的高度;

第三行输入m个数,表示左视图上每一个位置的高度。

【输出描述】

输出两个数,分别表示可能的体积的最大值和最小值。

【输入样例】

2 2

1 1

1 1

【输出样例】

2 4

【数据范围及提示】

样例中,最大最小值对应的海拔图分别为:

1 1  1 0

1 1  0 1

对于10%的数据,n = m = 1;

对于10%的数据,n = m = 2;

对于20%的数据,1 <= n,m <= 3,0 <= hij <= 3;

对于100%的数据,1 <= n,m <= 1000,0 <= hij <= 1000。

源代码:#include<cstdio>#include<algorithm>using namespace std;int n,m,Max,Min,Front[1001],Left[1001];bool f1[1001],f2[1001];int main() {    scanf("%d%d",&n,&m);    for (int a=1;a<=n;a++)      scanf("%d",&Front[a]);    for (int a=1;a<=m;a++)      scanf("%d",&Left[a]);    for (int a=1;a<=n;a++)      for (int b=1;b<=m;b++)      {        Max+=min(Front[a],Left[b]);        if (Front[a]==Left[b]&&!f1[a]&&!f2[b]) //累加重合部分。        {            f1[a]=f2[b]=true;             Min+=Front[a];        }      }    for (int a=1;a<=n;a++) //如果不加,不符题意,故必须加上。      if (!f1[a]) //找到过即为重合部分。        Min+=Front[a];    for (int a=1;a<=m;a++)      if (!f2[a])        Min+=Left[a];    printf("%d %d",Max,Min);    return 0;}/*    这道题需要动点脑子。    寻找最大体积的思想应该是贪得无厌,只要符合题意就加上,即为:Max+=min(Front[i],Left[j]);    寻找最小体积的思想应该是迫不得已,先把重合的部分加上,再把符合题意的临界部分加上。*/

地形图