CCF CSP 202006-2 稀疏向量(C++语言100分)

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;
}

6.提交AC结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46223009/article/details/125192120