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
思想
这是一道阅读理解题,仔细阅读题目。看一下样例解释:
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;
}