UVa 1445 - Cubist Artwork

统计正面看高度为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\n", ans );
    }
    return 0;
}

 

posted @ 2013-09-11 20:54  冰鸮  阅读(251)  评论(0编辑  收藏  举报