


测试数据:
10 3 4
4 5
7 -3
10 1
1 10
4 20
5 30
7 40
100分代码:
//先暂存u,v数组,然后将都不为0的项相乘相加,得到内积
#include <iostream>
using namespace std;
typedef struct point
{
int index;
int value;
}point;
int main()
{
int n,a,b,c,d;
long long sum=0;
cin >> n >> a >> b;
point u[a],v[b];
for(int i=0;i<a;i++)
{
cin >> c >> d;
u[i].index=c;
u[i].value=d;
}
for(int j=0;j<b;j++)
{
cin >> c >> d;
v[j].index=c;
v[j].value=d;
}
int j=0;
for(int i=0;i<a;i++)
{
while(j<b&&u[i].index>v[j].index)
{
j++;
}
if(j<b&&u[i].index==v[j].index)
{
sum+=u[i].value*v[j].value;
}
}
cout << sum << endl;
return 0;
}
60分代码:
//先暂存u,v数组,然后将都不为0的项相乘相加,得到内积
#include <iostream>
using namespace std;
int main()
{
int n,a,b,c,d;
long long sum=0;
cin >> n >> a >> b;
long long u[n+1],v[n+1];
for(int i=0;i<=n;i++)
{
u[i]=v[i]=0;
}
for(int i=0;i<a;i++)
{
cin >> c >> d;
u[c]=d;
}
for(int j=0;j<b;j++)
{
cin >> c >> d;
v[c]=d;
}
for(int i=1;i<=n;i++)
{
if(u[i]!=0&&v[i]!=0)
{
sum+=u[i]*v[i];
}
}
cout << sum << endl;
return 0;
}
注意:要注意复杂度,会扣分。
二刷
#include <iostream>
struct point{
int index;
int value;
};
using namespace std;
int main(){
int n,a,b;
long long sum=0;
cin >> n >> a >> b;
point array1[a],array2[b];
for(int i=0;i<a;i++)
{
cin >> array1[i].index >> array1[i].value;
}
for(int i=0;i<b;i++)
{
cin >> array2[i].index >> array2[i].value;
}
int i=0,j=0;
while(i<a&&j<b)
{
if(array1[i].index==array2[j].index)
{
sum+=array1[i].value*array2[j].value;
i++;
j++;
}
else if(array1[i].index<array2[j].index)
{
i++;
}
else if(array1[i].index>array2[j].index)
{
j++;
}
}
cout << sum << endl;
return 0;
}
注意:涉及到乘法时一定要注意int是否足以保存结果,数值较大时要用long long.
博客提及测试数据,给出100分和60分代码,强调代码复杂度会影响评分。还提到二刷时,涉及乘法运算要注意int类型可能无法保存较大结果,数值大时需用long long。
6970

被折叠的 条评论
为什么被折叠?



