CSP-202006-2-稀疏向量
【60分思路-暴力枚举】
- 显然
u[100000000], v[100000000]
过不了7,8,9,10的样例,但是思路也比较简单易懂,初学者可以参考
#include <iostream>
using namespace std;
int u[100000000], v[100000000];
long long inner;
int main() {
int n, a, b;
cin >> n >> a >> b;
for (int i = 0; i < a; i++)
{
int index, value;
cin >> index >> value;
u[index] = value;
}
for (int i = 0; i < b; i++)
{
int index, value;
cin >> index >> value;
v[index] = value;
if (u[index] != 0)
{
inner += (u[index] * v[index]);
}
}
cout << inner;
return 0;
}
【100分思路-暴力枚举】
稀疏向量由Vector
结构体数组表示,每个Vector
元素存储了向量中非零元素的索引(index
)和值(value
)。
解题思路
- 点积计算: 使用两个指针
i
和j
分别遍历向量u
和v
。只有当两个向量在相同索引位置上都有非零元素时,这些元素的乘积才会对最终的内积结果产生贡献。这一过程通过以下步骤实现:- 如果
u[i].index == v[j].index
,说明找到了两个向量在同一位置上的非零元素,它们的乘积应该被加到内积inner
中。然后,同时增加i
和j
的值,以继续检查下一个非零元素。 - 如果
u[i].index > v[j].index
,说明v
向量的当前非零元素索引较小,应增加j
来尝试找到匹配的非零元素索引。 - 如果
u[i].index < v[j].index
,则相反,应增加i
以尝试找到匹配的非零元素索引。
- 如果
int i = 0, j = 0;
while (i < a && j < b)
{
if (u[i].index == v[j].index)
{
inner += u[i].value * v[j].value;
i++, j++;
}
else if (u[i].index > v[j].index) j++;
else if (u[i].index < v[j].index) i++;
}
- 这一步是解题的关键,双层嵌套和暴力在时间和空间上都A不了
#include <iostream>
using namespace std;
struct Vector
{
int index;
int value;
};
int main() {
int n, a, b;
long long inner = 0;
cin >> n >> a >> b;
Vector* u = new Vector[a];
Vector* v = new Vector[b];
for (int i = 0; i < a; i++)
{
cin >> u[i].index >> u[i].value;
}
for (int i = 0; i < b; i++)
{
cin >> v[i].index >> v[i].value;
}
int i = 0, j = 0;
while (i < a && j < b)
{
if (u[i].index == v[j].index)
{
inner += u[i].value * v[j].value;
i++, j++;
}
else if (u[i].index > v[j].index) j++;
else if (u[i].index < v[j].index) i++;
}
cout << inner;
delete[]u;
delete[]v;
return 0;
}
参考:【ccf csp】202006-2 稀疏向量(有好几个坑) 满分代码 C++