Neighbor 隔壁

这里写图片描述
这里写图片描述

最大值的求法: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;
}
原文地址:https://www.cnblogs.com/dfsac/p/7587786.html