CCF-CSP 202312-1 仓库规划
😸题目要求
西西艾弗岛上共有
n
n
n 个仓库,依次编号为
1
⋅
⋅
⋅
n
1···n
1⋅⋅⋅n 。每个仓库均有一个
m
m
m 维向量的位置编码,用来表示仓库间的物流运转关系。
具体来说,每个仓库
i
i
i 均可能有一个上级仓库
j
j
j ,满足:仓库
j
j
j 位置编码的每一维均大于仓库
i
i
i 位置编码的对应元素。比如编码为
(
1
,
1
,
1
)
(1,1,1)
(1,1,1) 的仓库可以成为
(
0
,
0
,
0
)
(0,0,0)
(0,0,0) 的上级,但不能成为
(
0
,
1
,
0
)
(0,1,0)
(0,1,0) 的上级。如果有多个仓库均满足该要求,则选取其中编号最小的仓库作为仓库
i
i
i 的上级仓库;如果没有仓库满足条件,则说明仓库是一个物流中心,没有上级仓库。
现给定
n
n
n 个仓库的位置编码,试计算每个仓库的上级仓库编号。
🐈⬛输入格式
从标准输入读入数据。
输入共
n
+
1
n+1
n+1 行。
输入的第一行包含两个正整数
n
n
n 和
m
m
m,分别表示仓库个数和位置编码的维数。
接下来
n
n
n 行依次输入
n
n
n 个仓库的位置编码。其中第
i
i
i 行
(
1
≤
i
≤
n
)
(1 \leq i \leq n)
(1≤i≤n) 包含
m
m
m 个整数,表示仓库
i
i
i 的位置编码。
🐈⬛输出格式
输出到标准输出。
输出共
n
n
n 行。
第
i
i
i 行
(
1
≤
i
≤
n
)
(1 \leq i \leq n)
(1≤i≤n) 输出一个整数,表示仓库
i
i
i 的上级仓库编号;如果仓库
i
i
i 没有上级,则第
i
i
i 行输出
0
0
0。
🐈⬛样例输入
4 2
0 0
-1 -1
1 2
0 -1
🐈⬛样例输出
3
1
0
3
🐈⬛样例解释
对于仓库2: ( − 1 , − 1 ) (-1,-1) (−1,−1) 来说,仓库1: ( 0 , 0 ) (0,0) (0,0) 和仓库3: ( 1 , 2 ) (1,2) (1,2) 均满足上级仓库的编码要求,因此选择编号较小的仓库1作为其上级。
🐈⬛子任务
50% 的测试数据满足
m
=
2
m=2
m=2 ;
全部的测试数据满足
(
0
<
m
≤
10
)
(0 < m \leq 10)
(0<m≤10) 、
(
0
<
n
≤
1000
)
(0 < n \leq 1000)
(0<n≤1000),且位置编码中的所有元素均为绝对值不大于 106 的整数。
😸问题解决
🐈满分代码(含逐行代码解释)
🍭C++
#include<bits/stdc++.h>
using namespace std;
int main(){
//输入
int n, m; //n表示仓库个数, m表示位置编码维数
cin >> n >> m; //输入仓库个数和位置编码维数
int D[n][m]; //给仓库开一个数组D[][],表示每个仓库的具体位置编码
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> D[i][j]; //循环输入每个仓库的位置编码
}
}
//判断
int warehouse; //warehouse表示来表示符合条件的所有上级仓库中编号最小仓库
bool flag; //flag用来判断上级仓库是否满足每个维数都大于下级仓库的条件
for(int i = 0; i < n; i++){ //大循环为遍历所有仓库
warehouse = 1001; //因为0<n<=1000,所以最大编号设置为1001
for(int j = 0; j < n; j++){ //二层循环为遍历所有仓库(与大循环一样,用来做比较仓库)
flag = true; //初始默认flag为true
for(int k = 0; k < m; k++){ //三层循环为遍历所有仓库的位置编码维数
if(D[j][k] <= D[i][k]){ //对当前仓库和j其他所有仓库i而言,如果当前仓库j在m个维数里有一个位置对应的元素小于等于遍历的仓库i中的维数的话
flag = false; //说明这当前仓库j不是所遍历的仓库i的上级仓库,此时就把flag值设置为false
}
}
if(flag == true){ //如果m个维数对应的元素都满足条件,那么当前仓库j是是所遍历的仓库i的上级仓库,此时可能有多个上级仓库
warehouse = min(warehouse, j + 1); //不管上级仓库有多少个,选取编号最小的作为上级仓库
}
}
if(warehouse == 1001){ //如果最小的仓库编号为1001,也即没有在1001个仓库里遍历到符合条件的上级仓库
cout << "0" << endl; //说明没有符合条件的仓库或当前仓库j是每个维数都最大的仓库,此时输出0
}
else{
cout << warehouse << endl; //否则输出最小的仓库编号
}
}
return 0;
}
🍭Python
n, m = map(int, input().split())
warehouses = []
for _ in range(n):
warehouses.append(list(map(int, input().split())))
# 对于每行输入,我们使用map()函数将元素转换为整数,并使用list()函数将它们存储到一个列表中
# 我们将这个列表添加到warehouses列表中,即将所有仓库的位置编码存储在了warehouses列表中。
for i in range(n):
warehouse = next((j + 1 for j in range(n) if all(warehouses[j][k] > warehouses[i][k] for k in range(m))), None)
print(warehouse if warehouse else 0)
# 生成器表达式使用range()函数生成一个包含所有仓库编号的迭代器,然后使用条件判断(if语句)过滤掉不符合条件的仓库编号,最后返回所有符合条件的仓库编号。
# next()函数用于获取生成器返回的第一个元素,即最小的符合条件的仓库编号。如果没有符合条件的上级仓库,则将warehouse变量设置为None。
'''
代码使用了列表推导式和all()函数来进行条件判断。
通过使用next()函数和生成器表达式,我们可以在一行内找到满足条件的上级仓库编号。
如果没有符合条件的上级仓库,则输出0
'''
🐈场景拓展
本题根据仓库维度进行仓库定级,其拓展角度有两方面,一方面是针对仓库选址的网格优化,一方面是针对仓库中不同种类货物的数量多少。本题完全等价于,为仓库选取编号,其中的维数为该仓库中不同种类货物的数量,根据仓库中货物数量对仓库位置的重要性进行排序,以此结合实际生活进行更为深入的讨论,成为可以衡量仓库之间距离或优劣关系的指标。