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

    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;
}

猜你喜欢

转载自blog.csdn.net/weixin_61017400/article/details/124169377