(一)、题目描述
(二)、题目分析
这道题如果采用二维数组存储或者用两个for循环来实现,那么很容易运行超时,提交只能得30分。所以代码必须优化,采用一维数组存储并只用一个while循环来实现。
(三)、c++代码
//2020-06-02-稀疏向量
//输入两个n维向量,并给出非零的取值,求这两个向量的内积(相同的位置乘积相加)
//问题:代码超时了
//解决:把结构体的存储结构改成一维数组
#include<bits/stdc++.h>
using namespace std;
//const int max_=5*100000+5;
//int a1[max_],a2[max_],b1[max_],b2[max_];
int main()
{
int n,a,b;
scanf("%d%d%d",&n,&a,&b);
int a1[a],a2[a],b1[b],b2[b]; //用四个一维数组来存储向量u的标记,u的值,v的标记,v的值;
int i,j;
int id,val; //向量的标记,向量的值;
for(i=0;i<a;i++)
{
scanf("%d%d",&id,&val);
a1[i]=id;
a2[i]=val;
}
for(j=0;j<b;j++)
{
scanf("%d%d",&id,&val);
b1[j]=id;
b2[j]=val;
}
long long sum=0;
//不能有两个for循环,必须修改成一个
//用一个while循环实现,否则运行时间过长
i=0;j=0;
while(i<a&&j<b)
{
if(a1[i]==b1[j])
{
sum+=a2[i]*b2[j];
i++;
j++;
}
else if(a1[i]>b1[j])
{
j++;
}
else if(a1[i]<b1[j])
{
i++;
}
}
cout<<sum<<endl;
return 0;
}
(四)、结果分析
在CCF官网提交,满分。