#CCF题目
题号2020-06-02
题目背景
本题有2个坑
不可以用数组下标作为维度,因为数组下标是有界限的,因此当声明数组
元素个数过大的时候,并不安全
抛去这一点,还有一个就是内积的数据类型,要声明为long long型的,因为
内积可能很大,如果不注意,这里会出错
如果不注意这两点,一般都是60分
源码
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n,a,b;
// cin>>n>>a>>b;
scanf("%d %d %d",&n,&a,&b);
int uindex[a],uvalue[a],vindex[b],vvalue[b];//分别用来存储U,V向量的索引和value值
for(int i=0;i<a;++i)
{
// cin>>uindex[i]>>uvalue[i];
scanf("%d %d",&uindex[i],&uvalue[i]);
}
for(int i=0;i<b;++i)
{
// cin>>vindex[i]>>vvalue[i];
scanf("%d %d",&vindex[i],&vvalue[i]);
}
int utag=0,vtag=0;//记录U,V数组中当前正在访问的下标
long long sum=0;
while(utag<a && vtag<b)//只要任意一个向量遍历完,就可以停止循环,因为除去这几个非零项,其他都为零,可以不去计算
{
while(uindex[utag]==vindex[vtag])//只有当前访问的U,V向量的元素下标相同时才进行内积的计算
{
sum=sum+uvalue[utag]*vvalue[vtag];
++utag;
++vtag;//继续访问U,V向量的下一个元素
}
if(uindex[utag]>vindex[vtag])//指的是当U向量当前访问元素的维度大于V向量当前访问元素的维度,那么此时就需要等待V向量元素的维度增加到与U向量当前访问元素的维度相同,因此++vtag,然后返回上一步的while循环判断U,V当前访问元素的维度是否相同,若相同,则进行内积的计算;若不能,则继续进行维度的比较与调整,直到当前访问U,V元素的维度相同的时候才进行计算
{
++vtag;
}
if(uindex[utag]<vindex[vtag])//与以上相反
{
++utag;
}
}
// cout<<sum<<endl;
printf("%lld",sum);
return 0;
}
输入源码 满分