Online Judge 基礎觀念:多測資輸入不需把資料都讀入後再輸出

有的題目會要求一次輸入多筆測資,例如:
TOJ 3
NTU judgegirl 80

常見初學者的寫法會將所有的資料讀入,存進陣列裡面,一個一個處理完之後再輸出。

但事實上不需要這麼做,你只需要每次讀入一個一組測資,直接輸出答案就行了!完全不需要浪費額外記憶體去開陣列。
以 TOJ 5 為例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int gcd(int a,int b){/*略*/}
int main()
{
int T;
scanf("%d",&T);
for(int i=0;i<T;i++)
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d",gcd(a,b));
}
}

題目的output不是要求要一次輸出所有答案嗎?事實上並不是的。在你電腦裡面的terminal(或者cmd)中,輸入和輸出會有即時的互動,也就是說當你打完每一組測試資料,它就會立刻輸出答案,因此你會看到輸入和輸出湊在一起的情況。

在 Online Judge 中,輸入和輸出可以當成兩個檔案,因此先後順序是沒有關係的。
在你的電腦中,可以在terminal模擬類似的環境:

  1. 開啟terminal(在windows上則是cmd)。
  2. 使用cd命令切換到測資和執行檔所在的資料夾。
  3. 把要輸入的測試資料存成一個文字檔,例如input.txt
  4. 執行以下命令:執行檔 < input.txt > output.txt 或者 執行檔 < input.txt,此處使用了 io redirection 的技巧,細節可以自行上網查詢。

我們把input.txt作為程式的輸入資料,輸出的資料則存在output.txt,在 Online Judge 中也是使用類似的方法實作。