统计正面看高度为i的竖条个数为cnt1[i], 统计侧面看高度为i的竖条个数为cnt2[i];
ans = sum( i * max( cnt1[i], cnt2[i] ) ); ( 1 <= i <= 20 )
若使方块数最少,则令高度为i的竖条从正面看和侧面看都是同一条即可。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> using namespace std; int cnt1[];
int cnt2[]; int main()
{
int W, D;
while ( scanf( "%d%d", &W, &D ), W || D )
{
memset( cnt1, , sizeof(cnt1) );
memset( cnt2, , sizeof(cnt2) );
for ( int i = ; i < W; ++i )
{
int a;
scanf( "%d", &a );
++cnt1[a];
}
for ( int i = ; i < D; ++i )
{
int a;
scanf( "%d", &a );
++cnt2[a];
}
int ans = ;
for ( int i = ; i < ; ++i )
ans += i*max( cnt1[i], cnt2[i] );
printf( "%d\n", ans );
}
return ;
}