CSP认证2020-06-2-稀疏向量-(Java)100分

稀疏向量

问题描述
试题编号: 202006-2
试题名称: 稀疏向量
时间限制: 2.0s
内存限制: 512.0MB
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最初用的数组标记,标记 a, b 的 index

int[] aflag = new int[n+1];
int[] bflag = new int[n+1];

Java整形数组是开不到109的,超出了内存分配空间,所以测试7-10是通不过的,只能拿60分。
计算最终结果使用long型的才行,如果使用 int ,测试7-10中满足不了106 * 106,即1012,超出了 int 的最大范围231-1,故依旧60分。
很多博主都说是Scanner的读取数据慢,导致60分,其实本题Scanner类也可以满分的。
测试了n遍,学了其他博主一些,终于算是满分通过了。
Java 100分代码
在这里插入图片描述
蓝色使用Scanner类读取数据几乎快接近限制时间和空间了,倒也是可以满分通过。
后来看了其他博主的优化方法,使用BufferedReader(红色),时间和空间都缩小了很多。
Java代码如下(Scanner类)

import java.util.Scanner;

public class Main {
    public static void main(String [] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int a = sc.nextInt();
        int b = sc.nextInt();
        int[][] vector_a = new int[a][2];

        for(int i = 0;i < a;i++){
            vector_a[i][0] = sc.nextInt();
            vector_a[i][1] = sc.nextInt();
        }

        long sum = 0;
        int index_a = 0, b_index = 0, b_value = 0;
        for(int i = 0;i < b;i++){
            b_index = sc.nextInt();
            b_value = sc.nextInt();
            if(index_a < a && vector_a[index_a][0] == b_index){
                sum += vector_a[index_a][1]*b_value;
            }else{
                while(index_a < a && vector_a[index_a][0] < b_index){
                    index_a++;
                    if(index_a < a && vector_a[index_a][0] == b_index)
                        sum += vector_a[index_a][1]*b_value;
                }
            }
        }
        System.out.println(sum);
    }
}

Java代码如下(BufferedReader)

import java.io.*;

public class Main {
    public static void main(String [] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        String[] s = str.trim().split(" ");
        int n = Integer.valueOf(s[0]);
        int a = Integer.valueOf(s[1]);
        int b = Integer.valueOf(s[2]);
        int[][] vector_a = new int[a][2];

        for(int i = 0;i < a;i++){
            str = br.readLine();
            String[] s_a = str.trim().split(" ");
            vector_a[i][0] = Integer.valueOf(s_a[0]);
            vector_a[i][1] = Integer.valueOf(s_a[1]);
        }

        long sum = 0;
        int index_a = 0, b_index = 0, b_value = 0;
        for(int i = 0;i < b;i++){
            str = br.readLine();
            String[] s_b = str.trim().split(" ");
            b_index = Integer.valueOf(s_b[0]);
            b_value = Integer.valueOf(s_b[1]);
            if(index_a < a && vector_a[index_a][0] == b_index){
                sum += vector_a[index_a][1]*b_value;
            }else{
                while(index_a < a && vector_a[index_a][0] < b_index){
                    index_a++;
                    if(index_a < a && vector_a[index_a][0] == b_index)
                        sum += vector_a[index_a][1]*b_value;
                }
            }
        }
        System.out.println(sum);
    }
}
原文地址:https://www.cnblogs.com/jiaohuadehulike/p/14294997.html