【java】 202006-2 csp稀疏向量60分问题解决

题目描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这道题做的磕磕碰碰,好歹最后还是做出来了。

java数据录入问题

超时的时候, 一开始以为是java的Scanner类录入慢的问题,在网上查阅资料发现java的scanner类读数据的确是很慢的,刷OJ的最好使用BufferedReader (缓冲区)

示例:

class Reader {
    static StringTokenizer token =new StringTokenizer("");
    static BufferedReader  reader   =new BufferedReader (new InputStreamReader(System.in)) ;
    static String nextLine() throws IOException {
        return reader.readLine() ;
    }
    static  String next() throws IOException {
        while(!token.hasMoreTokens()) {
            token =new StringTokenizer(reader.readLine()) ;
        }
        return token.nextToken() ;
    }

    static int nextInt() throws IOException {
        return Integer.parseInt(next()) ;
    }
    static double nextDouble() throws IOException {
        return Double.parseDouble(next()) ;
    }

}

参考链接
在这里插入图片描述
StringTokenizer
是一个用来分隔字符串的类
构造函数:

  1. StringTokenizer(String str)
    构造一个用来解析 str 的 StringTokenizer 对象。java 默认的分隔符是空格("")、制表符(\t)、换行符(\n)、回车符(\r)

  2. StringTokenizer(String str,String delim)
    构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符。

  3. StringTokenizer(String str, String delim,boolean ,returnDelims)

常用方法:

boolean hasMoreTokens() 判断是否还有分隔符

String nextToken() 返回当前位置到下一个分隔符的字符串

java整型数组能开多大

一开始想用暴力法,开了一个数组装第一个向量:

int a[]=new int[n+1] ; 

对于前3组测试用例,n小于5*10^5次方都是可以的,最后一组就会报错,所以就只能得60分,其实java对整型数组的长度是有范围的,太大的会超出内存分配的空间。 我在本地跑了一下,确实报错了。

参考(Java整型数组的最大长度到底有多长?)
在这里插入图片描述

ac代码

解决了运行超时问题和运行错误问题,就好做了。

import java.io.*;
import java.util.*;


class Reader {
    static StringTokenizer token =new StringTokenizer("");
    static BufferedReader  reader   =new BufferedReader (new InputStreamReader(System.in)) ;
    static String nextLine() throws IOException {
        return reader.readLine() ;
    }
    static  String next() throws IOException {
        while(!token.hasMoreTokens()) {
            token =new StringTokenizer(reader.readLine()) ;
        }
        return token.nextToken() ;
    }

    static int nextInt() throws IOException {
        return Integer.parseInt(next()) ;
    }
    static double nextDouble() throws IOException {
        return Double.parseDouble(next()) ;
    }

}
public class Main {
public static void main(String[] args) throws IOException {

  
    int n = Reader.nextInt() ;
    int a = Reader.nextInt() ;
    int b = Reader.nextInt() ;

    HashMap<Integer,Integer> arr=new HashMap<> () ;
    
    
    for(int i=0;i<a;i++) {
        int index= Reader.nextInt() ;
        int num=Reader.nextInt() ;
        arr.put(index,num) ;
       
    }
    long res=0L ;
    
    for(int i=0;i<b;i++) {
        int index= Reader.nextInt() ;
        int num=Reader.nextInt() ;
       
        if(num!=0 && arr.containsKey(index) ) {
            res += num* arr.get(index) ; 
        }   
    }

    System.out.println(res) ;
    
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值