csp 202006-2 稀疏向量
60分
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main(){
int n,a,b,indexi,valuei,i;
long long ans=0;
scanf("%d%d%d",&n,&a,&b);
int h[n+1]={0};
for(i=0;i<a;i++){
scanf("%d%d",&indexi,&valuei);
h[indexi]=valuei;
}
for(i=0;i<b;i++){
scanf("%d%d",&indexi,&valuei);
if(h[indexi]!=0)ans=(long long)ans+h[indexi]*valuei;
}
printf("%lld\n",ans);
return 0;
}
解决方法:
1.用数组下标直接储存维度,但 n=10^9 肯定越界,所以可以把维度换位数组的值。开辟数组a,b,a[][0]储存index,a[][1]储存value.(改成两个数组分数仍然60)
2.固定数组的长度(非常重要 我就是把其中两个数组n+1改成500000后,分数直接从60变成了100)。
注:
1.设数组为n+1我好傻呜呜呜,明明就是为了避开越界用了两个数组,结果数组长度直接用n+1.
2.栈区好像就只有1m,1M=1024KB(千字节) 1KB=1024Byte(字节) 1Byte=8Bit(位) 。int根据操作系统或处理器(如64位XP)把int定义为8字节(64位),全给栈数组下标也就是131072左右?
100分
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main(){
long long int ans=0,n,a,b,indexi,valuei,i,j,o;
scanf("%d%d%d",&n,&a,&b);
int h[500000][2]={0},k[500000][2]={0};
for(i=0;i<a;i++){
scanf("%d%d",&indexi,&valuei);
h[i][0]=indexi;h[i][1]=valuei;
}
for(i=0;i<b;i++){
scanf("%d%d",&indexi,&valuei);
k[i][0]=indexi;k[i][1]=valuei;
}
i=0;j=0;
while(i!=a&&j!=b){
o=h[i][0]-k[j][0];
if(o==0){ans+=h[i][1]*k[j][1];i++;j++;}
else if(o>0)j++;
else i++;
}
printf("%lld\n",ans);
return 0;
}
注:
1.没有认真读题,理解错误n的意思 认为每次输入时a/b个index1,indexi2,,,indexin加上value。
2.开数组以后还是做一个固定长度比较好,少用不确定输入变量n。