Lead of Wisdom

暴力枚举,剪枝

题意:

图片说明

分析:

这题没什么,真的没什么。考虑数据范围,就真的只是单纯的枚举而已。
最多再做一些剪枝优化,比如种类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;
    }
}

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

全部评论

相关推荐

无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务