UVA434 - Matty's Blocks

题目链接

题意:给出n,代表所要用积木搭建的整体的底面积的边长,然后分别给出正视图和右视图,要你求出搭建都要形状的最小木块数量和最小木块数量和最大木块数量的差值。

思路:其实题目就是要你求出最小木块数和最大木块数,我们可以分开求解。

首先对于最小木块数,要想用最少的立方体搭建,那就意味着正视图中的每一竖立方体的高度最好都要被右视图中的高度所利用到。所以我们以正视图为基准,正视图需要的立方体总数加上侧视图存在无法利用正视图的数量,就是最少需要的立方体数。其次对于最大木块数,我们也以正视图为基准,再对照右视图,一层一层计算木块数,尽量每一层都能铺满,然后累加上去就是最大的木块数了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN = 10;

int a[MAXN], b[MAXN], num1[MAXN], num2[MAXN];
int n;

int getMin() {
    memset(num1, 0, sizeof(num1));
    memset(num2, 0, sizeof(num2));
    for (int i = 1; i <= n; i++) {
        num1[a[i]]++;
        num2[b[i]]++;
    }
    int sum = 0;
    for (int i = 1; i <= MAXN; i++)
        sum += max(num1[i], num2[i]) * i;
    return sum;
}

int getMax() {
    int cnt1, cnt2, sum = 0;
    while (1) {
        cnt1 = 0;
        for (int i = 1; i <= MAXN; i++)
            if (a[i]) {
                cnt1++;
                a[i]--;
            }
        cnt2 = 0;
        for (int i = 1; i <= MAXN; i++)
            if (b[i]) {
                cnt2++;
                b[i]--;
            }
        if (!cnt1 && !cnt2) break;
        sum += cnt1 * cnt2;
    }
    return sum;
}

int main() {
    int cas;
    scanf("%d", &cas);
    while (cas--) {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        for (int i = 1; i <= n; i++)
            scanf("%d", &b[i]);
        int Min = getMin();
        int Max = getMax();
        printf("Matty needs at least %d blocks, and can add at most %d extra blocks.\n", Min, Max - Min);
    }
    return 0;
}

UVA434 - Matty's Blocks

时间: 2024-07-29 23:57:28

UVA434 - Matty's Blocks的相关文章

UVA - 434 Matty&#39;s Blocks

题意:给你正视和侧视图,求最多多少个,最少多少个 思路:贪心的思想,求最少的时候:因为可以想象着移动,尽量让两个视图的重叠,所以我们统计每个视图不同高度的个数,然后计算,至于的话,就是每次拿正视图的高度去匹配侧视求最大 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int MAXN = 1000;

UVA - 434 Matty&amp;#39;s Blocks

题意:给你正视和側视图,求最多多少个,最少多少个 思路:贪心的思想.求最少的时候:由于能够想象着移动,尽量让两个视图的重叠.所以我们统计每一个视图不同高度的个数.然后计算.至于的话.就是每次拿正视图的高度去匹配側视求最大 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int MAXN = 1000

【UVA】434-Matty&amp;#39;s Blocks

一道非常easy想复杂的题,给出主视图和右视图,计算最少能用几个正方体组成相应的视图,以及最多还能加几块正方体. 求最多加入事实上就是求出最多的正方体数减去最少的,主要就是最少的不好求. 一開始各种模拟就是不正确,之后发现,仅仅须要统计两个视图的高度个数就能够了(简直了) 14390495 434 Matty's Blocks Accepted C++ 0.016 2014-10-21 11:35:11 #include<cstdio> #include<cstring> #inc

【UVA】434-Matty&#39;s Blocks

一道很容易想复杂的题,给出主视图和右视图,计算最少能用几个正方体组成对应的视图,以及最多还能加几块正方体. 求最多添加其实就是求出最多的正方体数减去最少的,主要就是最少的不好求. 一开始各种模拟就是不对,之后发现,只需要统计两个视图的高度个数就可以了(简直了) 14390495 434 Matty's Blocks Accepted C++ 0.016 2014-10-21 11:35:11 #include<cstdio> #include<cstring> #include&l

uva434(逻辑)

题意: 在一个n*n的方正上叠正方体; 现在给出前视图,和右视图: 问最少几个方块,还有最多在加几个方块(也就是最多减最少): 思路: 最少的很好求: 最小值的话,两个视图,存在高度一样的,就只取一次,高度不一样就两个都取: 最大值的话,先看前视图,并假设前视图后面堆满了方块: 然后看右视图,右视图中的每一个都要去前视图把多余的高度减掉: 例如 前视图的2 3 0 1: 右视图如果有一个1 那么2的要减1,3的要减2,0,1的不变: 如果有一个2: 那么3的要减1,0,1,2的都不变: #inc

【Code::Blocks】windows 环境下编译 Code::Blocks(已修正)

Code::Blocks 在2012-11-25发布了最新的12.11版本,相比上一个版本(10.05),Code::Blocks 进行了许多改进和更新(Change log). 引用 Wikipedia:Code::Blocks: Code::Blocks是一个免费.开源.跨平台的IDE,使用C++开发,并且使用wxWidgets做为GUI函式库.Code::Blocks使用了插件架构,其功能可以使用插件自由地扩充.目前, Code::Blocks主要针对开发C/C++程式而设计. Code:

Using ffmpeg libraries in Code::Blocks

I am digging into a project that needs to use some open source video codec library. ffmpeg is very powerful video codec library, which I decided to use in my project. I compiled and installed the ffmpeg library, then the problem comes, how to use the

BZOJ 2086: [Poi2010]Blocks

2086: [Poi2010]Blocks Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 494  Solved: 222[Submit][Status][Discuss] Description 给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1.经过一定次数的操作后,问最大能够选出多长的一个连续子序列,使得这个子序列的每个数

令Code::Blocks支持C++11特性

GNU 4.7.0以上的版本可以支持C++11新特性,因此可采用集成了这样的编译器的Code::Blocks.这里下载:http://pan.baidu.com/s/1ntGGpBz 文件名:codeblocks-13.12mingw-setup.exe,在CodeBlocks官网上也能找到其下载地址. 不过,下载完后还需要进行一个设置才能开启C++11新特性.选择setting->compiler,先到Toolchain executables选项卡下,看MinGW的路径是否正确.如图: 然后