CCF题稀疏向量

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



输入源码 满分

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值