zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
  • 相关阅读:
    Javascript之旅——第七站:说说js的调试
    Javascript之旅——第六站:看看writable特性
    Javascript之旅——第五站:说说那些所谓的包装类型
    Javascript之旅——第四站:parseInt中要注意的坑
    Javascript之旅——第三站:几个需要注意的运算符
    Javascript之旅——第二站:对象和数组
    Javascript之旅——第一站:从变量说起
    学习和使用 PHP 应该注意的10件事
    8/7排位赛,codeforces501
    8.7排位赛,codeforces501
  • 原文地址:https://www.cnblogs.com/jiaohuadehulike/p/14294997.html
Copyright © 2011-2022 走看看