文章目录
- 一、题目
- 1、原题链接
- 2、题目描述
- 二、解题报告
- 1、思路分析
- 2、时间复杂度
- 3、代码详解
一、题目
1、原题链接
5415. 仓库规划
2、题目描述
二、解题报告
1、思路分析
思路参考y总:y总讲解视频
(1)由于每一个仓库均有一个m维向量的位置编码,所以可以利用一个二维数组来表示n个仓库的m维向量。
(2)由于数据量较小,我们可以枚举每个仓库,然后再枚举所有仓库依次来判断是否可以作为其上级仓库,此时要注意题目中要求:若有多个满足的上级仓库,取编号最小的一个。我们可以通过编号从小到大枚举到满足条件的上级仓库直接跳出循环(break
);或者只有当编号小于当前已保存答案的值时才更新答案。
(3)根据(2)中得到的仓库编号,依据题目要求输出即可。
2、时间复杂度
时间复杂度为O(n2m)
3、代码详解
#include <iostream>
using namespace std;
const int N = 1010, M = 15;
int a[N][M];
int ans[N];
int main () {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
ans[i] = N; //初始化所有仓库的上级仓库编号为一个很大的数
for (int j = 0; j < m; j ++) {
cin >> a[i][j];
}
}
for (int i = 0; i < n; i++) { //枚举每个仓库
for (int j = 0; j < n; j++) { //枚举每个仓库,从而来判断是否可作为i的上级仓库
bool flag = true; //记录是否满足上级仓库条件
for (int k = 0; k < m; k++) { //枚举j仓库的每一维,判断是否严格大于i仓库的每一维
if (a[i][k] >= a[j][k]) flag =false;
}
//在满足上级仓库条件的基础上,取最小的仓库编号
if (flag && j + 1 < ans[i]) ans[i] = j + 1;
}
}
for (int i = 0; i < n ; i++) {
if (ans[i] == N) cout << 0 << endl; //如果ans[i]没有被更新过,说明该仓库不存在上级仓库
else cout << ans[i] << endl;
}
return 0;
}