Vijos P1059 - 积木城堡

传送门

Vijos P1059 - 积木城堡

思路

把每个塔能达到的高度全部记录下来,最后扫描一遍,如果数量是n,输出。和上一题有异曲同工之妙

代码

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define MP(a, b) make_pair(a, b)
const int MAXN = 10000 + 10;
const int INF = 0x3f3f3f3f;
 
int dp[MAXN], ans[MAXN];
 
int main()
{
    //freopen("input.txt", "r", stdin);
    int n, i, j, cur, a, vmax = -1;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        cur = 0;
        memset(dp, 0, sizeof dp);
        while (scanf("%d", &a), a != -1)
        {
            dp[0] = 1;
            for (j = cur; j >= 0; j--)
                dp[j + a] |= dp[j];
            cur += a;
        }
        vmax = max(vmax, cur);
        for (j = vmax; j >= 1; j--)
            dp[j] ? ans[j]++ : 0;
    }
    for (i = vmax; i >= 1; i--)
        if (ans[i] == n)
        {
            printf("%d\n", i);
            return 0;
        }
    printf("0\n");
    return 0;
}

Powered by Jekyll and Theme by solid