第01篇 ACM/ICPC競賽之基礎篇

一、ACM/ICPC競賽的特點

ACM/ICPC(國際大學生程序設計競賽)是以算法設計爲主的程序設計競賽,並不涉及具體的應用技術。

ACM/ICPC競賽以組隊形式參賽,每個參賽隊由三名隊員組成,共同使用一臺計算機解題。通常每場比賽的試題爲6至10題,根據各隊的完成題數和罰時進行排名。題目提交通過稱爲完成,從比賽開始到提交成功所用的時間爲題目的基礎罰時,另外,一道題目每提交失敗一次,將增加20分鐘罰時。也就是說,參賽隊要儘可能用最快的速度、最少的失敗次數,解決最多的題目。

二、輸入和輸出處理

試題一般採用標準輸入和輸出方式讀取輸入和產生輸出,在題目中會詳細描述輸入和輸出的格式和值域範圍,所寫的程序一定要嚴格遵守題目指定的輸入輸出格式。

在比賽試題的輸入和輸出處理上,針對一些常見的情形,有一些常用的方法。

1、多測試用例的輸入和輸出

有些試題在一次輸入中只包含一個測試用例,也就是說,程序每運行一次,只算一道題。也有些試題在一次輸入中包含多個測試用例,也就是說,程序每運行一次,要計算多道題。

對多用例輸入,通常會先輸入要計算的用例的個數,然後依次輸入每個測試用例的輸入數據,但程序並不需要等到所有的測試用例都計算完後再輸出所有測試用例的計算結果,而是可以讀入一個測試用例,輸出一個結果,再讀入一個測試用例,再輸出一個結果。因此對多用例輸入的試題,可以用這樣的輸入模式:

以C++爲例:

int n;

cin >> n;

for (int i=0; i<n; i++)

{

    讀入測試用例數據

    計算

    輸出計算結果

}

2、單測試用例輸入的結束判斷

對單用例輸入,最主要的問題是如何知道輸入什麼時候結束。

有些試題會指定某種特殊的輸入值作爲輸入的結束標誌,這種情況比較容易處理,只須在讀入後,判斷一下讀入的內容是否爲約定結束值即可。

有些試題並不指定特殊的輸入值,而是以EOF(文件結束標誌)作爲結束標誌。如果從文件流讀入,當讀到文件尾時,輸入返回EOF。如果從鍵盤讀入時,在Windows的終端中,是以Ctrl+Z表示EOF。對於這種情況,可以用這樣的輸入模式:

以C++爲例:

int m, n; // 假設要連續輸入一組整數對

while (cin>>m>>n)

{

    處理整數對(m, n)

}

以C語言爲例:

int m, n;

while (scanf("%d%d", &m, &n)==2)

{

    處理整數對(m, n)

}

三、數據結構的設計

很多試題中已經給出了數據量的上限,因此可以很方便地以數組的方式定義數據結構。但也要注意到有些題目中沒有明確指出數據上限時,切不可盲目定義數組大小。

例如在題1070(多項式求和)中,並未說明輸入多項式的項數,對這種情況就不宜用數組方式來表示多項式了——除非你的運氣足夠好,所開闢的數組大小能夠經受所有的測試用例的考驗。

除了使用一般的數組或鏈表結構外,對使用C++的選手來說,STL也是一大利器,充分運用可以有效提高編程的效率和正確性。

四、測試用例的考慮

在試題中通常會給出測試用例的樣例,這通常會被我們用來測試自己的程序,而且很多選手往往在正確計算出測試用例樣例時,會認爲自己的程序是正確的。

其實測試用例的樣例只是測試用例的個例,實際用於測試的測試用例往往會涵蓋各種極限情況和邊界情況,而且有時測試用例的數量還會比較大,甚至會重複測試同一個測試用例。因此我們的程序能夠通過樣例測試,未必能夠通過所有的測試用例的測試,一方面要全面考慮所有可能的極限情況和邊界情況,一方面程序要有足夠的效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章