算法&OJ--其他--OnlineJudge输入输出特辑

  • 总结Java的OJ输入可行处理
  • OJ入门级问题
  • Java的输入输出
    • 一般使用Scanner对象来读取控制台的输入
    • 常见的处理:
      • Scanner对象in
      • in.hasNext()时读取in.next()或in.nextInt()或in.nextLine()
  • 自己IDE测试读取输入,最后需手动输入文件结束符EOF

    • 输入完数据集后回车一行
    • 然后Mac–输入Control+d
      • Windows系统下键入control+z,同时键入ctrl+z
  • 例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    /**
    * 输入描述:输入包括一行,一行中有4个正整数x1, k1, x2, k2(1 ≤ x1,x2 ≤ 10^9, 1 ≤ k1,k2 ≤ 50),以空格分割
    * 如:1010 3 101010 2
    */
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] s = new String[4];
    int index = 0;
    while(in.hasNext()) {
    s[index++] = in.next();
    }
    // ······
    }
    // ······
    }

    /**
    * 输入描述:输入中有多组测试数据,每组测试数据为一个整数A(1 ≤ A ≤ 5000).
    * 如:
    > 5
    > 3
    */
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    ArrayList<Integer> nums = new ArrayList<>();
    while(in.hasNext()) {
    nums.add(in.nextInt());
    }

    // ······

    }
    }

    /**
    * 输入描述:每组输入数据分为三行,第一行有两个数字n,m(0 ≤ n,m ≤ 10000),分别表示集合A和集合B的元素个数。后两行分别表示集合A和集合B。每个元素为不超过int范围的整数,每个元素之间有个空格隔开。
    * 如:
    > 3 3
    > 1 3 5
    > 2 4 6
    */
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    int count = 0;
    Scanner in = new Scanner(System.in);
    ArrayList<Integer> reads = new ArrayList<>();

    while(in.hasNext()) {
    reads.add(in.nextInt());
    count++;
    }
    int[] a = new int[reads.size()-2];
    for(int i=0; i<a.length; i++) {
    a[i] = reads.get(i+2);
    }

    // ······

    }
    }

一些入门级问题

    1. 什么是“在线编程”?
      • 在线编程,是利用“Online Judge”系统实时判断编程结果的一种训练/考试方式。“Online Judge”简称OJ,它有一个web界面与其用户交流,还有一个后台的编译系统,编译、运行用户提交的程序代码,并判断代码的正误。
    1. “在线编程”有哪些限制?
      • 你的程序(我们称之为“作业”)提交给 OJ系统后,OJ后台的编译器会编译该作业。如果通过,则运行这个作业。
      • 限制1: 你的“作业”代码中,main()函数的返回值一定得是0 (即: return 0;)
      • 限制2: 你的“作业”只允许从控制台读取数据(用C语言的scanf()、getchar()等;C++的cin)
      • 限制3: 你的“作业”值允许输出到控制台(用C语言的printf()等,C++的cout);
      • 限制4: 你的“作业”不允许读写文件系统(不能使用C语言的fprintf()等,不能使用C++的fstream等);
    1. “在线编程(OJ)”系统如何判断提交的程序是否正确?
      • 判断1: 编译不能有错误
      • 判断2: OJ系统运行你的程序,你的程序的返回值必须是 0,如果不是0,说明程序运行时出现错误
      • 判断3: 在OJ出题的人,会预先提供一些输入数据和输出结果;你的“作业”在运行时会被“喂”进上述输入数据,然后你的“作业”会输出信息,这些信息与上述“输出结果”【逐个字符】对比。如果对比完全一致,则判定你的“作业”正确。
    1. 如何检查你自己的程序是否正确?
      • 在题目中,会给你一套对应的“输入样例”和“输出样例”。你在运行自己的作业时,将“输入样例”喂给你的程序(用键盘,别用勺子!)得到的输出结果与“输出样例”一个字符都不差(空格、换行都算在内)完全相同,那么你的程序的输出格式就是正确的。
      • 例子
        • OJ中的一个题目:编写程序,计算输入的两个整数之和。
          • 输入: 空格分隔的两个整数;
          • 输出: 整数之和
          • 出题者给的输入和输出 (这就是本课程中的“测试例”。测试例的具体内容,只有出题者才能看到)
            • 输入样例:-3 1
            • 输出样例:-2
            • 你的程序如果输出以下信息,都是错的
              • 错误1:输出结果前有空格 > -2
              • 错误2:输出结果后有空格 >-2_
              • 错误3:输出结果后有回车换行 > -2 >
              • 错误4:有额外提示信息 >output: -2
              • 错误5:输出的不是整数 >-2.000
            • 有时出题者会给出一些极端的测试例,用于检测你的程序是否足够健壮:
              • 输入:-999999999999999999999999999 1
              • 输出:>?#$#%#@!%^