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;
    }
}

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

全部评论

相关推荐

11-15 18:39
已编辑
西安交通大学 Java
全村最靓的仔仔:卧槽,佬啥bg呢,本也是西交么
点赞 评论 收藏
分享
09-30 12:39
门头沟学院 C++
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务