40pts求调,豆包不中用
查看原帖
40pts求调,豆包不中用
1478608
WaLeo楼主2025/8/5 09:46
#include <bits/stdc++.h>
using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false), cin.tie(0);

    int s, n, m;
    cin >> s >> n >> m;
    vector man(n, vector<int>(s));
    for (int i = 0; i < s; i++) {
        for (int j = 0; j < n; j++) {
            cin >> man[j][i];
        }
    }
    for (int i = 0; i < n; i++) {
        sort(man[i].begin(), man[i].end());
    }
    vector<vector<array<int, 2>>> groups(n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < s; j++) {
            if (j < s - 1 && man[i][j] == man[i][j + 1]) {
                continue;
            } else if (man[i][j] * 2 + 1 <= m) {
                groups[i].push_back({man[i][j] * 2 + 1, (i + 1) * (j + 1)});
            } else break;
        }
    }

    vector<int> dp(m + 1);

    for (int i = 0; i < n; i++) {
        for (int j = m; j >= 0; j--) {
            bool is_break = false;
            for (auto &[fee, val] : groups[i]) {
                if (j < fee) {
                    is_break = true;
                    break;
                }
                dp[j] = max(dp[j], dp[j - fee] + val);
            }
            if (is_break) break;
        }
    }

    cout << dp[m] << "\n";

    return 0;
}
2025/8/5 09:46
加载中...