【题目描述】
地形图可通过一个高度矩阵表示,矩阵中每一个位置都有一个数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]); 寻找最小体积的思想应该是迫不得已,先把重合的部分加上,再把符合题意的临界部分加上。 */