最大值的求法:h[i][j]的高度为min(h1[i],h2[j]);既保证不会超过最大值,又能尽量的大。
最小值的求法:先考虑没有重复的,每一个高度都需要加上。除了需要看见的,其他的都设为零。
在每一行放置的时候,如果某一列中有与他相等的,且还没有放置
,就可以将这两个柱子重合,减去一倍的高度。
#include<iostream>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 1e9
using namespace std;
int n,m;
int h1[1009],h2[1009],h[1009][1009];
int l1[1009],l2[1009];
LL ans1,ans2;
bool f[1009];
int main()
{
freopen("neighbor.in","r",stdin);
freopen("neighbor.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&h1[i]),ans2+=h1[i];
for(int i=1;i<=m;i++) scanf("%d",&h2[i]),ans2+=h2[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans1+=min(h1[i],h2[j]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(h2[j]==h1[i]&&!f[j])
{
ans2-=h1[i];
f[j]=1;
break;
}
}
}
printf("%lld %lld
",ans2,ans1);
return 0;
}