隔壁
/* 最大体积很显然 最小体积用贪心做的,如果横向和纵向的高度一样,那么这个位置的高度就固定了,最后如果一整行或一整列的高度都没固定,就找一个合适的位置固定。 */ #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; }