洛谷 P3613 【深基15.例2】寄包柜

【题目链接】

洛谷 P3613 【深基15.例2】寄包柜

【题目考点】

1. STL map
2. STL pair

pair<T1, T2> make_pair(T1 a, T2 b);
make_pair函数可以将两个量组合成一个pair类型的对象。

【解题思路】

共有 1 0 5 10^5 105个寄包柜,每个寄包柜最多有 1 0 5 10^5 105格子。
如果每个格子都用一个int类型的变量表示,那么需要声明int a[100000][100000],共 1 0 10 10^{10} 1010个int类型的变量。内存限制128M,最多保存 128 ∗ 1024 ∗ 1024 / 4 ≈ 3 ∗ 1 0 7 128*1024*1024/4\approx 3*10^7 12810241024/43107个int类型的变量,一定会内存超限。
由于超市中的寄包格子总数不会超过 1 0 7 10^7 107,如果我们可以为每个可能的寄包格子设一个int类型的变量来保存该格子中的物品,这就是可行的。

这里需要用到表示映射的STL map。

解法1:每个柜子是一个map对象,使用map数组

我们可以为每个寄包柜设一个map对象,map中的键为格子编号,值为物品。
设map数组map<int, int> locker[100005]locker[i]表示第i个寄包柜,locker[i][j]表示第i个寄包柜第j个格子中的物品。
由于数据量达到 1 0 5 10^5 105,在主函数内声明会栈溢出,需要将locker声明成全局变量。

解法2:将柜子与格子编号组合成pair对象作为键

由于给定柜子、格子编号后,就能唯一确定一个位置,因此可以将柜子与格子编号合成一个pair类的对象,以这个pair对象作为键,值是物品。这样只需要声明一个map对象:map<pair<int, int>, int> mp;
mp[make_pair(i, j)]为第i个柜子第j个格子中的物品。

【题解代码】

解法1:每个柜子是一个map对象,使用map数组
#include <bits/stdc++.h>
using namespace std;
#define N 100005
map<int, int> locker[N];//locker[i]:第i个寄包柜,locker[i][j]:第i个寄包柜第j个格子中的物品。
int main()
{
	int n, q, t, i, j, k;
	cin >> n >> q;
	while(q--)
	{
		cin >> t;
		if(t == 1)
		{
			cin >> i >> j >> k;
			locker[i][j] = k;
		}
		else//t == 2 
		{
			cin >> i >> j;
			cout << locker[i][j] << endl;
		}
	}
	return 0;
}
解法2:将柜子与格子编号组合成pair对象作为键
#include <bits/stdc++.h>
using namespace std;
int main()
{
	map<pair<int, int>, int> mp;
	int n, q, num, i, j, k;
	cin >> n >> q;
	while(q--)
	{
		cin >> num;
		if(num == 1)
		{
			cin >> i >> j >> k;
			mp[make_pair(i, j)] = k;
		}
		else
		{
			cin >> i >> j;
			cout << mp[make_pair(i, j)] << endl;
		}
	}
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值