欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【CSP】202006-2 稀疏向量

程序员文章站 2022-04-07 09:04:00
...

题目

【内容】:
【CSP】202006-2 稀疏向量
【CSP】202006-2 稀疏向量
【CSP】202006-2 稀疏向量
【CSP】202006-2 稀疏向量

思路:

思路很简单,用结构体数组存储点的位置,然后用两个for循环遍历两个向量数组,这时候问题出现了30分代码:

#include<iostream>
#include<algorithm>
using namespace std;

int n,a,b;
struct Point
{
	int index;
	int value;
}p[100000],p1[1000000];


int main()
{
	cin>>n>>a>>b;
	for(int i=1;i<=a;i++)
	{
		int indexi,valuei;
		cin>>indexi>>valuei;
		p[i].index=indexi;
		p[i].value=valuei;
	}
	for(int j=1;j<=b;j++)
	{
		int indexj,valuej;
		cin>>indexj>>valuej;
		p1[j].index=indexj;
		p1[j].value=valuej;
	}
	int result=0;
	if(a<=b)
	{
		for(int i=1;i<=a;i++)
		{
			for(int j=1;j<=b;j++)
			{
				if(p[i].index == p1[j].index)
				{
					result += p[i].value*p1[j].value;
					break;
				}
			}
		}
	}
	else
	{
		for(int i=1;i<=b;i++)
		{
			for(int j=1;j<=a;j++)
			{
				if(p1[i].index == p[j].index)
				{
					result += p1[i].value*p[j].value;
					break;
				}
			}
		}
	}
	cout<<result<<endl;
}
问题:

当a,b数据值较大的时候,两个for循环会导致超时所以要用一个while或者一个for循环来处理,以及声明result的时候要用long long 型。

【100分代码】:

#include<iostream>
#include<algorithm>
using namespace std;

const int max_ = 5*100000+5;
int n,a,b;
struct Point
{
	int index;
	int value;
}p[max_],p1[max_];


int main()
{
	cin>>n>>a>>b;
	for(int i=1;i<=a;i++)
	{
		int indexi,valuei;
		cin>>indexi>>valuei;
		p[i].index=indexi;
		p[i].value=valuei;
	}
	for(int j=1;j<=b;j++)
	{
		int indexj,valuej;
		cin>>indexj>>valuej;
		p1[j].index=indexj;
		p1[j].value=valuej;
	}
	long long result=0;
	int i=1,j=1;
	while((i<=a) && (j<=b))
	{
		if(p[i].index == p1[j].index)
		{
			result += p[i].value*p1[j].value;
			i++;
			j++;
		}
		if(p[i].index>p1[j].index)	j++;
		if(p[i].index<p1[j].index)	i++;
	}
	cout<<result;
	return 0;
}

PS.之前还出现了一个错误就是改了为了一个while循环以后还是出现错误,后面发现应该是空间开打了我开的是10^6,最后在全局变量那声明了max_就解决问题了。

相关标签: 模拟题