1. 问题链接:CCF 202006-2 稀疏向量
试题编号: | 202006-2 |
试题名称: | 稀疏向量 |
时间限制: | 2.0s |
内存限制: | 512.0MB |
问题描述: |
|
2. 问题分析:
经过读题分析,本题要求计算两个 n n n维向量在稀疏表示下的内积。只需要对相同维度的数值相乘再累加即可,比较简单。具体实现这里给出三种方法:第一种方法,利用unordered_map容器存储第一个向量 u u u维度到数值的映射关系,再对第二个向量 v v v进行流处理,以 O ( 1 ) O(1) O(1)时间复杂度查找稀疏表示的维度是否存在于第一个向量 u u u,存在的做计算。第二种方法,重载小于运算符,利用set容器对稀疏表示的维度和数值组成的结构体自动排序,然后以 O ( log n ) O(\log n) O(logn)时间复杂度查找稀疏表示的维度是否存在于第一个向量 u u u,存在的做计算。第三种方法,开一个稀疏表示的维度和数值组成的结构体数组,重载小于运算符,然后从小到大排序后对相邻两个结构体的维度进行线性扫描,对相同的做计算。请读者任选一种作为参考,自己实现一遍。
3. C++代码程序实现方法1-利用unordered_map容器:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
int n,a,b,idx,val,temp;
scanf("%d%d%d",&n,&a,&b);
LL ans=0;
unordered_map<int,int> sparse_vector;
for (int i=0;i<a ;++i )
{
scanf("%d%d",&idx,&val);
sparse_vector[idx]=val;
}
for (int i=0;i<b ;++i )
{
scanf("%d%d",&idx,&val);
temp=sparse_vector[idx];
if (temp!=0)
{
ans+=val*temp;
}
}
printf("%lld",ans);
return 0;
}
4. C++代码程序实现方法2-利用set容器:
#include <bits/stdc++.h>
using namespace std;
struct SparseV
{
int index,value;
SparseV(int _idx,int _val)
{
this->index=_idx;
this->value=_val;
}
bool operator<(const SparseV&sv) const
{
return this->index<sv.index;
}
};
int main()
{
int n,a,b,idx,val;
long long ans=0;
scanf("%d%d%d",&n,&a,&b);
set<SparseV> sparse_vector;
for (int i=0;i<a ;++i )
{
scanf("%d%d",&idx,&val);
sparse_vector.insert(SparseV(idx,val));
}
for (int i=0;i<b ;++i )
{
scanf("%d%d",&idx,&val);
auto it=sparse_vector.find(SparseV(idx,val));
if (it!=sparse_vector.end())
{
ans+=it->value*val;
}
}
printf("%lld",ans);
return 0;
}
5. C++代码程序实现方法3-利用sort排序:
#include <bits/stdc++.h>
using namespace std;
struct sparseV
{
int index,value;
bool operator<(const sparseV& sv)
{
return this->index<sv.index;
}
};
int main()
{
int n,a,b,idx,val;
long long ans=0;
sparseV now,next;
scanf("%d%d%d",&n,&a,&b);
int len=a+b;
sparseV uv[len];
for (int i=0;i<len ;++i )
{
scanf("%d%d",&idx,&val);
uv[i].index=idx;
uv[i].value=val;
}
sort(uv,uv+len);
--len;
for (int i=0;i<len ;++i )
{
now=uv[i],next=uv[i+1];
if (now.index==next.index)
{
ans+=now.value*next.value;
}
}
printf("%lld",ans);
return 0;
}