仓库规划

按仓库编号从小到大枚举候选上级,选择第一个在所有编码维度都严格更大的仓库。

OJ: shumeng

题目 ID: CSP202312A

难度:入门

标签:枚举模拟

日期: 2026-07-31 16:21

形式化题目

给定 nn 个仓库,每个仓库有一个 mm 维整数位置编码。仓库 jj 可以成为仓库 ii 的上级,当且仅当 jj 的每一维编码都严格大于 ii 的对应维;若有多个候选,选编号最小的,否则输出 00。要求对每个仓库输出它的上级编号。

思路

直接按定义枚举即可,数据范围很小(n1000n\le 1000)。

枚举候选

对每个仓库 ii,按编号 1,2,,n1,2,\dots,n 的顺序枚举候选 jj。枚举顺序就是编号递增顺序,因此找到的第一个满足条件的 jj 必然是编号最小的上级。

判断条件

检查 jj 的每一维是否都严格大于 ii 的对应维。只要发现某一维满足 code[j][k] <= code[i][k],即可判定 jj 不合格;所有维度都严格大于时记录并停止。

注意候选不能是自身(i == j)。

代码

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-07-31 16:21
 * update_at: 2026-08-17 22:40
 */
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1005;

int n, m;
int code[MAXN][15]; // code[i][k] 仓库 i 的第 k 维位置编码

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

    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int k = 0; k < m; k++) cin >> code[i][k];
    }

    // 对每个仓库,按编号递增的顺序找第一个满足条件的上级
    for (int i = 1; i <= n; i++) {
        int parent = 0;
        for (int j = 1; j <= n; j++) {
            if (i == j) continue; // 不能是自己
            bool greater = true;
            // 每一维都必须严格大于
            for (int k = 0; k < m; k++) {
                if (code[j][k] <= code[i][k]) {
                    greater = false;
                    break;
                }
            }
            if (greater) {
                parent = j;
                break; // 编号最小且可行,直接停止
            }
        }
        cout << parent << '\n';
    }

    return 0;
}

复杂度

最坏情况下每个仓库要检查全部仓库和全部维度,时间复杂度为 O(n2m)O(n^2m),空间复杂度为 O(nm)O(nm)

总结

题目只要求编号最小的可行候选,不需要比较候选之间的“优劣”。按编号顺序扫描并在第一个满足条件的位置停止,就同时完成了可行性判断和最小编号选择。