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) (1in) 包含 m m m 个整数,表示仓库 i i i 的位置编码。

🐈‍⬛输出格式

输出到标准输出。
输出共 n n n 行。
i i i ( 1 ≤ i ≤ n ) (1 \leq i \leq n) (1in) 输出一个整数,表示仓库 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<m10) ( 0 < n ≤ 1000 ) (0 < n \leq 1000) (0<n1000),且位置编码中的所有元素均为绝对值不大于 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
'''

🐈场景拓展

本题根据仓库维度进行仓库定级,其拓展角度有两方面,一方面是针对仓库选址的网格优化,一方面是针对仓库中不同种类货物的数量多少。本题完全等价于,为仓库选取编号,其中的维数为该仓库中不同种类货物的数量,根据仓库中货物数量对仓库位置的重要性进行排序,以此结合实际生活进行更为深入的讨论,成为可以衡量仓库之间距离或优劣关系的指标。

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值