线性表——洛谷(寄包柜)

这篇博客通过一道编程题介绍了STL中的vector和map在解决实际问题中的应用。文章讨论了为什么在寄包柜问题中选择使用vector而非二维数组,并解释了map作为二维矩阵替代品的原因。示例代码分别展示了vector和map的使用方法,强调了遍历顺序的重要性以及如何存储和检索数据。
摘要由CSDN通过智能技术生成

    P3613 【深基15.例2】寄包柜 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)   

        这道是一道简单的STL的运用(vector,map),写出来给大家借鉴学习一下vector和map的使用。

        vector是不定长数组,例如vector<int> a,就是定义一个a的不定长数组,可以随便往里面存值。本题可以定义二维数组来做吗?理论是可以的,不过数组太大会MLE,原因是浪费太多空间了,所以我们使用不定长数组,有多少值就开多少空间,这样就不会有浪费。

#include <bits/stdc++.h>
#define MOD 1000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
int n,m;

struct node {
	vector<int> num,w;//num表示第i个寄包柜存物品,w表示第i个第num格存物品k(num和w的位置对应)
} a[100005];


int main() {
	cin>>n>>m;
	while(m--) {
		int p,i,j,k;
		cin>>p>>i>>j;
		if(p==1) {
			cin>>k;
			a[i].num.push_back(j);
			a[i].w.push_back(k);
		} else {
//必须从大到小遍历。为什么不可以从小到大遍历?
//因为同一个格子可能重复放了物品,后放的物品会取代前放的物品,而我们需要输出后放的物品
			for(int h=a[i].num.size()-1; h>=0; h--) {
				if(a[i].num[h]==j) {//找到该格子就输出
					cout<<a[i].w[h]<<endl;
					break;//输出完就溜了,不然后面被取代的值会再次被输出
				}
			}
		}
	}
	return 0;
}

        map是一个映射,具体定义:map<int,int> m,意思就是从int映射到int,使用方法和给数组赋值没啥区别,例如m[2] = 5,就是从2映射到5(可以朴素的理解为数学中的函数f(x)的使用),不过函数的话只能是数映射到数,而映射可以是数映射到矩阵。扯远了,回到这题就是二维矩阵里面存了个数,可是我们定义二维矩阵的话会MLE,因此我们定义一个二维映射,也就是给二维数组赋值。

#include <bits/stdc++.h>
#define MOD 1000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
int n,m;
map<int,map<int,int> > a;//二维map
int main() {
	cin>>n>>m;
	while(m--) {
		int p,i,j,k;
		cin>>p>>i>>j;
		if(p==1) {
			cin>>k;
			a[i][j]=k;//存值
		} 
		else cout<<a[i][j]<<endl;
	}
	return 0;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_谦言万语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值