csp 202006-2 稀疏向量

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。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值