看板 b99902HW 關於我們 聯絡資訊
※ [本文轉錄自 math120908 信箱] 作者: [email protected] ([email protected]) 標題: [關於] 寫 Online Judge part.2 時間: Wed Oct 20 08:33:10 2010 作者: skyly (skyly) 看板: NextArcadia 標題: [關於] 寫 Online Judge part.2 時間: Wed Oct 20 01:48:45 2010 這次要談的是有關寫 Online Judge 題目的 Input 所需要注意的一些事項. 首先, 通常 Online Judge 的題目可以分為兩大類型: Batch problems (normal case) 跟 Interactive problems Batch problems 也就是平時較常看到的問題, 就是給你的測試資料是一次給定的, 講白一點即你可以隨時讀資料隨時輸出資料. 例如你可以一筆一筆慢慢的作, 也可以全部讀進來一起做再一口氣輸出. Interactive problems 一般稱做 互動題, 這種題目比較少見. 對於一題互動題, 你可能要 include 一些題目提供的 header files, 然後或許要使用一些題目給訂的 functions 之類的, 因題而異. 最特別的一點是你主要是要 跟 judge system 互動, 例如說你可能要做一些 function calls 傳入一些值才能繼續作下去之類的. //TIOJ 1087 或許是一個不錯的例子 接著要談的是關於題目的 輸入型態, 在這邊我們只討論 Batch 題, 也就是一般的題目的情況. 我們對於一個 Batch 題目的輸入, 通常分作 單筆輸入 多筆輸入(循環輸入) 所謂的 單筆輸入 例如 Judgegirl 就是一個很好的例子, 意思就是對於每一筆測試資料, 都重新將 input 導入你的執行檔. (maybe 是分做很多檔案) 來一個 example: 請輸入一個整數 n, 並輸出 n. 那麼你可以這樣寫: #include <stdio.h> int main() { int n; scanf("%d", &n); printf("%d\n", n); //記得我們上次說的要換行嗎? return 0; } 這種寫法就是針對所謂的單筆輸入. 而單筆輸入的題目通常在題目中會有一些關鍵的句子告訴你是單筆輸入, 例如說 "本題只有一筆測試資料", 但這並不代表這題真的只有一筆測試資料, 而只是要提醒你該題是屬於單筆輸入的題目. 另一種更為常見的則是 多筆輸入(或稱作 循環輸入), 意思就是你每一次程式的執行都要讀多筆的測試資料, 而其中又分為 1. 以 EOF 作結束 2. 以限定條件做結束 example for case 1: 本題有多筆輸入, 以 EOF 作為結束. 對於每一筆輸入給定兩個整數 a, b, 請輸出 a+b 的結果. 那麼你可以這樣寫: #include <stdio.h> int main() { int a, b; while ( scanf("%d%d", &a, &b) != EOF ) { //這個助教應該有提過 printf("%d\n", a + b ); } return 0; } 實際題目的話你可能會見到以下關鍵句, 來判定這題是屬於 EOF 類 的多筆輸入題: "There are multiple input in the testcase. The input is ended by EOF." example for case 2: 本題有多筆輸入, 對於每一筆輸入一個正整數 a, 請輸出 a+1 的結果. 以 a=0 作為結束. 那麼你可以這樣寫: #include <stdio.h> int main() { int a; while ( scanf("%d", &a) != EOF ) { if ( a == 0 ) break; printf("%d\n", a + 1 ); } return 0; } 對於這種 case, 題目會說明該以什麼條件做為輸入的結尾, 如 example 中的 a=0 就是輸入結尾的條件. 那麼或許你會有個問題, 如果題目都沒說的話怎麼辦?! 此時你應該先以 " EOF 多筆輸入 " 作為第一考量, 比較不容易錯. Input 所需要注意的一些部分大致上介紹到這裡. 是說包括這次提的 Input 或者是上次講的 Output, 其實都還有很多細節尚未說明到, 只是在此先舉出一些常見的問題. 其中包括很多因素, 比如說有些觀念還沒有教到等等, 那其實也沒有必要急著去鑽那些點, 所以在這兩篇文中我就沒有多提. 不過如果大家真的有遇到除了這些以外的問題還是歡迎來提問~ 那麼就先這樣了. -- ※ 發信站: 批踢踢兔(ptt2.cc) ◆ From: 123.194.173.14
ryan8175ptt2:太用心了Q_Q 我要推暴她(?) 不是啦推暴這篇文推 10/20 07:46
math120908:繼續轉轉轉:p推 10/20 08:32
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.137
m80126colin:強者用心讀者認真推 10/20 09:13
s864372002:還有第三個類型 - 在開頭給定資料筆數~ 10/20 09:45
skyly:抱歉昨天太晚打腦筋不清楚竟然漏了...Orz 我原文加上去了XD 10/20 23:19