地形图

【题目描述】

地形图可通过一个高度矩阵表示,矩阵中每一个位置都有一个数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]);
    寻找最小体积的思想应该是迫不得已,先把重合的部分加上,再把符合题意的临界部分加上。
*/
原文地址:https://www.cnblogs.com/Ackermann/p/5931995.html