2021年PAT乙级秋考 B-4 数组与链表 (20 分) 题型:大模拟

73 阅读3分钟

B-4 数组与链表 (20 分)

让我们来设计这样一种数组与链表结合的整数存储的结构 A:

这种结构首先初始化一个长度为 L0的整型数组 A0,返回给用户使用。当用户访问第 i 个元素 A[i] 的时候,如果 0≤i<L0,则 A[i] 对应 A0[i],系统就返回 h0 + i × sizeof(int) 作为要访问的地址,其中 h0是数组 A0的起始位置,sizeof(int) 是数组元素的大小,这里元素就是 int 型,占 4 个字节。

当用户访问越界时(即 i≥L0),系统将另外开辟一个长度为 L1的数组 A 1。此时 A[i] 对应 A1 [j](这里 i 和 j 之间的映射关系留给你去推导)。如果 0≤j<L1 ,则返回 h1+j×sizeof(int) 作为要访问的地址,其中 h1 是数组 A1的起始位置。

当 A1[j] 继续越界时,系统就按照上述规则继续开辟另一个长度为 L2的数组 A2 ,并以此类推。
本题就请你实现这个系统功能,为用户的任何一次访问返回对应元素的地址。

输入格式 输入第一行给出两个正整数 N(≤104)和 K(≤103),分别为最多允许开出的数组个数、以及用户访问的次数。 此后 N 行,每行给出两个正整数,分别是一个数组的初始地址(≤107)和长度(≤100),其间以空格分隔。题目保证这些数组占据的空间无重叠。 最后一行顺序给出 K 个用户访问的数组下标,为区间 [0,220] 内的整数。

输出格式 对每个用户访问,在一行中输出对应的地址。但如果用户的访问超出了 N 个数组的存储范围,则这个访问是非法的,要输出Illegal Access,并且对这个访问不采取任何处理。

最后一行请输出上述过程中一共创建了多少个数组。

输入样例

6 7
2048 5
128 6
4016 10
1024 7
3072 12
9332 10
2 12 25 50 28 8 39

输出样例

2056
4020
1040
Illegal Access
3072
140
3116
5

思想

这是一道阅读理解题,仔细阅读题目。看一下样例解释:

image.png

code

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
int n, k;

struct Node {
	LL adr;
	int len;
} node;

vector<Node>v;


int main() {
	cin >> n >> k;

	for (int i = 0; i < n; i++) {
		cin >> node.adr >> node.len;
		v.push_back(node);
	}

	int nodecnt = 1; //存放最后一共开辟了多少个数组

	for (int i = 0; i < k; i++) { //k次查询
		int ans = 1;
		int cnt = 0;

		bool flag = false; //当达到了最大开辟数组的数量时退出循环

		int x;
		cin >> x; //k个要查询的点

		//访问每个数组的起始地址
		for (int j = 0; j < v.size(); j++) {
			if (flag)
				break;
			if (x >= cnt + v[j].len) { //如果是超出了数组的长度
				cnt += v[j].len; //加上当前数组的长度
				ans++;           //ans++表示又开辟了一个数组
				continue;
			} else { //如果没有超出当前数组的长度可以直接输出
				flag = true; //标记为可以输出
				cout << v[j].adr + (x - cnt) * 4 << endl; //x-cnt是在开辟的新数组的哪个位置
			}
		}
		//flag为false表示为越界
		if (!flag)
			cout << "Illegal Access" << endl;
		else
			nodecnt = ans;
	}
	cout << nodecnt << endl;
	return 0;
}

image.png