隔壁

/*
  最大体积很显然
  最小体积用贪心做的,如果横向和纵向的高度一样,那么这个位置的高度就固定了,最后如果一整行或一整列的高度都没固定,就找一个合适的位置固定。
*/
#include<cstdio>
#include<iostream>
#define N 1010
using namespace std;
int map[N][N],zhu[N],zuo[N],n,m;
int vzhu[N],vzuo[N];
void work1()
{
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
        if(zhu[i]==zuo[j]&&!vzhu[i]&&!vzuo[j])
        {
            map[i][j]=zhu[i];
            vzhu[i]=1;vzuo[j]=1;
        }
    for(int i=1;i<=n;i++)
      if(!vzhu[i])
      {
          for(int j=1;j<=m;j++)
            if(zhu[i]<=zuo[j]&&!map[i][j])
            {
                map[i][j]=zhu[i];
                if(zhu[i]==zuo[j])vzuo[j]=1;
                break;
          }
      }
    for(int j=1;j<=m;j++)
      if(!vzuo[j])
      {
          for(int i=1;i<=n;i++)
            if(zuo[j]<=zhu[i]&&!map[i][j])
            {
                map[i][j]=zuo[j];
                break;
          }
      }
    int tot=0;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
        tot+=map[i][j];
    printf("%d ",tot);
}
void work2()
{
    int tot=0;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
        tot+=min(zhu[i],zuo[j]);
    printf("%d",tot);
}
int main()
{
    //freopen("jh.in","r",stdin);
    //freopen("neighbor.in","r",stdin);
    //freopen("neighbor.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
      scanf("%d",&zhu[i]);
    for(int i=1;i<=m;i++)
      scanf("%d",&zuo[i]);
    work1();
    work2();
    return 0;
}
View Code

 

posted @ 2016-10-05 21:47  karles~  阅读(151)  评论(0编辑  收藏  举报