0分,求大佬修改
  • 板块题目总版
  • 楼主DYF2024
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/2/4 10:46
  • 上次更新2025/2/4 16:18:38
查看原帖
0分,求大佬修改
1584005
DYF2024楼主2025/2/4 10:46

0分,求大佬修改:P11652 [COCI 2024/2025 #4] 鞋 / Cipele https://www.luogu.com.cn/record/201208006

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

const int MAXN = 2e5 + 5;
const int MAXQ = 1e6 + 5;

int n, m, q;
int a[MAXQ];

// 计算鞋在鞋柜中的位置
int getPosition(int target, int state) {
    int pos = 1;
    for (int i = 1; i <= n; ++i) {
        if ((state & (1 << (i - 1))) == 0) {
            if (i == target) {
                return pos;
            }
            ++pos;
        }
    }
    return 0; // 鞋在走廊
}

int main() {
    cin >> n >> m >> q;
    for (int i = 1; i <= q; ++i) {
        cin >> a[i];
    }

    // 使用 vector 动态分配 dp 数组
    vector<vector<int>> dp(q + 1, vector<int>(1 << n, INT_MAX));
    dp[0][0] = 0;

    for (int i = 1; i <= q; ++i) {
        for (int state = 0; state < (1 << n); ++state) {
            if (dp[i - 1][state] == INT_MAX) continue;

            int target = a[i];
            int pos = getPosition(target, state);
            int cost = pos;

            // 情况 1:将鞋放在走廊
            if (__builtin_popcount(state) < m) {
                int newState = state | (1 << (target - 1));
                dp[i][newState] = min(dp[i][newState], dp[i - 1][state] + cost);
            }

            // 情况 2:将鞋放回鞋柜
            dp[i][state] = min(dp[i][state], dp[i - 1][state] + cost);
        }
    }

    int ans = INT_MAX;
    for (int state = 0; state < (1 << n); ++state) {
        ans = min(ans, dp[q][state]);
    }

    cout << ans << endl;

    return 0;
}
2025/2/4 10:46
加载中...