统计正面看高度为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[30]; int cnt2[30]; int main() { int W, D; while ( scanf( "%d%d", &W, &D ), W || D ) { memset( cnt1, 0, sizeof(cnt1) ); memset( cnt2, 0, sizeof(cnt2) ); for ( int i = 0; i < W; ++i ) { int a; scanf( "%d", &a ); ++cnt1[a]; } for ( int i = 0; i < D; ++i ) { int a; scanf( "%d", &a ); ++cnt2[a]; } int ans = 0; for ( int i = 0; i < 30; ++i ) ans += i*max( cnt1[i], cnt2[i] ); printf( "%d ", ans ); } return 0; }