暴力枚举,剪枝

题意:

图片说明

分析:

这题没什么,真的没什么。考虑数据范围,就真的只是单纯的枚举而已。
最多再做一些剪枝优化,比如种类ti的没有装备就直接跳过,或者说发现即使接下来的装备都是理论上最好的也无法大于已经更新的ans。。。。。。。。

代码如下:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
struct item { ll a, b, c, d; };
vector<item> items[55];
ll ans;
vector<int> idx;
int cmp_max[55][4];

void init() {
    for (int i = 0;i <= 50;i++)for (int j = 0;j < 4;j++)cmp_max[i][j] = 0;
    ans = 0;idx.clear();for (int i = 1;i <= 50;i++)items[i].clear();
}

void solve(ll dep, ll a, ll b, ll c, ll d) {
    if (dep >= idx.size()) { ans = max(ans, a * b * c * d);return; }
    if (items[idx[dep]].empty())return solve(dep + 1,a, b, c, d);
    if ((cmp_max[idx[dep]][0] + a) * (cmp_max[idx[dep]][1] + b) * (cmp_max[idx[dep]][2] + c) * (cmp_max[idx[dep]][3] + d) <= ans)return;
    for (int i = 0;i < items[idx[dep]].size();i++)solve(dep + 1,a + items[idx[dep]][i].a, b + items[idx[dep]][i].b, c + items[idx[dep]][i].c, d + items[idx[dep]][i].d);
}

int main() {
    ios::sync_with_stdio(0);
    int T;cin >> T;
    while (T--) {
        int n, k;cin >> n >> k;init();
        for (int i = 1;i <= n;i++) {
            int t, a, b, c, d;
            cin >> t >> a >> b >> c >> d;
            items[t].push_back({ a,b,c,d });
            cmp_max[t][0] = max(cmp_max[t][0], a);
            cmp_max[t][1] = max(cmp_max[t][1], b);
            cmp_max[t][2] = max(cmp_max[t][2], c);
            cmp_max[t][3] = max(cmp_max[t][3], d);
        }
        for (int j = 0;j < 4;j++)
            for (int i = k - 1;i >= 0;i--)
                cmp_max[i][j] += cmp_max[i + 1][j];
        for (int i = 1;i <= k;i++)if (!items[i].empty())idx.push_back(i);
        solve(0, 100, 100, 100, 100);
        cout << ans << endl;
    }
}

关键是我还没做出来,赛场上只想数学了。。。。。。哭