题目
给大家方便一下😂样例输入:
10 3 4
4 5
7 -3
10 1
1 10
4 20
5 30
7 40
解答一(60分)
#include<iostream>
using namespace std;
int u[140000010];
int main()
{
long long int n,a,b,i,j,x,y,sum=0;
cin>>n>>a>>b;
for(i=0;i<a;i++)
{
cin>>x>>y;
u[x]=y;
}
for(j=0;j<b;j++)
{
cin>>x>>y;
if(u[x]!=0)
sum+=u[x]*y;
}
cout<<sum;
}
如果实在没办法,暴力一下得60分也是不错的
解答二(100分)
这个题的主要限制在于空间,如解答一用数组下标直接储存维度,但
n
=
1
0
9
n=10^9
n=109肯定越界,所以可以把维度换位数组的值。
1.开辟数组a,b,a[][0]储存index,a[][1]储存value
2.求内积时,同时从a和b数组最小的index开始,进行比较后,index相同,value相乘 ;index不相同,小的那一组index增大。
(本思路唯一的缺点,是题目并为明确指出维度输入时一定依次增大)
#include<iostream>
using namespace std;
int u[500000][2],v[500000][2];
int main()
{
long long int n,a,b,i,j,x,y,sum=0;
cin>>n>>a>>b;
for(i=0;i<a;i++)
{
cin>>x>>y;
u[i][0]=x,u[i][1]=y;
}
for(i=0;i<b;i++)
{
cin>>x>>y;
v[i][0]=x,v[i][1]=y;
}
i=0,j=0;
while(i!=a&&j!=b)
{
int t=u[i][0]-v[j][0];
if(t==0) //index相同,value相乘
{
sum+=u[i][1]*v[j][1];
i++,j++;
}
else if(t<0) //u的index小
i++;
else //v的index小
j++;
}
cout<<sum;
}