ACM/ICPC

ACM/ICPC,全稱是ACM International Collegiate Programming Contest,國際大學生程式設計競賽,由國際計算機學界著名的ACM學會主辦。

簡介

ACM-ICPC比賽介紹及相關參考
ACM國際大學生程式設計競賽(ACM International Collegiate Programming Contest – ACM-ICPC)由國際計算機學界著名的ACM學會(Association for Computer Machinery)主辦,是世界上規模最大、水平最高的國際大學生程式競賽。每年舉辦一次。ACM成立於計算機誕生次年,是目前計算機學界中歷史最悠久、最具權威性的組織。

發展

ACM國際性大學生程式設計競賽自1970年開始,其宗旨是使大學生能通過計算機充分展示自己分析問題和解決問題的能力。參加本項比賽的選手至少需要掌握計算機科學的常用算法,基本的計算理論,(如:離散數學,具體數學,組合數學基礎),數據結構基礎,程式設計語言(規定是C/C++或者是Java)。在本項比賽中考察學生的不僅僅是能夠完成指定任務的程式,更要求在完成程式的功能的基礎之上提高程式的運行效率與空間占用率。我在浙江大學ACM線上測試組參加測試的最深體會就是你時時刻刻都應當去考慮如何去最大限度的最佳化,改善你的程式結構,已達到用最小的空間,最優的算法實現程式的功能。從數學角度考慮,題目主要的方向集中在工程數學,抽象數學很少涉及。一般題目都會給出要求和幾組輸入和輸出作為程式設計的參考,也是檢驗程式正確性的標準之一。
整個競賽分為地區預賽(Regional Contest)和決賽(Final Contest)兩個階段進行。今年(2003)在中國大陸地區舉行的ACM-ICPC區賽共有兩個賽區,分別由北京清華大學和廣州中山大學承辦。我們學校的計算機學院從去年起開始組織學生參加世界上最具權威性的大學生程式設計競賽,取得了較好的成績,我們學院在明年也要有組織的參加這項國際性的大賽,希望有志於此的同學加入我們的行列。我們會定期的舉辦相關的講座以使同學們對ACM-ICPC比賽有更多地了解。鑒於我院學生對這項比賽了解的實際情況,下面我就從浙江大學的線上題庫中選擇了Volume I當中的第一個題目向大家展示一下這項比賽的特點。
Calculate a + b
Input
The input will consist of a series of pairs of integers a and b,separated by a space, one pair of integers per line.
Output
For each pair of input integers a and b you should output the sum of a and b in one line,and with one line of output for each line in input.
Sample Input
1 5
Sample Output
6
Hint
Use + operator
如果選用的程式設計語言是 C++:
#include
int main()
{
int a,b;
while(cin >> a >> b)
cout << a+b << endl;
}
如果選用的程式設計語言是C:
#include
int main()
{
int a,b;
while(scanf("%d %d",&a, &b) != EOF)
printf("%d\n",a+b);
}
如果選用的程式設計語言是PASCAL
program p1001(Input,Output);
var
a,b:Integer;
begin
while not eof(Input) do
begin
Readln(a,b);
Writeln(a+b);
end;
end.
程式的功能中文描述是這樣的:在一行輸入兩個整型數,換行輸出結果,循環執行,直到用戶中止。
三個程式代碼都擺出來了,雖然這個程式極其簡單,但是可以說明很多語言的特點以及程式設計的思想,大家可以清楚地看到與一般的思路最大不同點就是沒有使用循環語句for,而是選擇while,結合程式設計語言自身的特點,從而大大的減少了代碼量,而且不易出錯。下面我把這個程式關鍵點的原理闡述一下:
針對題目的要求,要保證無數次輸入下程式的健壯性,而while語句這點的優勢就是及其突出的,此種情況下,我們通常採用在while循環結構的首部使用流讀取運算符輸入一系列值。當遇到檔案結束符或者是非法輸入時運算符返回0(false)這種結構非常適合事先並不知道有多少組輸入時,那么下面我們在著重說一下cin在這裡的用法.
上面的C++算法描述中,程式的跳出我們採用輸入非法字元,一旦輸入非法字元,則返回值為0(false)則,while循環結束,也就是輸入輸出流當中初學者不太常使用的流錯誤。
下面我們做一個簡單的介紹:
對於輸入輸出流的狀態,我們可以用類ios中的位測試流的狀態。類ios是輸入/輸出類istream,ostream和iostream的基類。當遇到檔案結束符時,輸入流中自動設定eofbit.可以在程式中使用成員函式eof確定是否已經到達檔案尾。如果cin遇到了檔案的結束符,那么函式調用:
cin.eof()
返回true,否則返回false
當流中發生格式錯誤的時候,雖然會設定failbit,但是字元並未丟失。成員函式fail判斷流操作是否失敗,這種錯誤通常可恢復。
當發生導致數據丟失的錯誤時,設定badbit.成員函式bad判斷流操作是否失敗,這種嚴重錯誤通常不可恢復。
如果eofbit,failbit,badbit都沒有設定,則設定goodbit
如果函式eo,fail,bad都沒有設定,則成員函式good返回true.成員函式中應當只對合法流進行I/O操作。
下面是為說明問題專門寫的一個測試代碼,
#include
int main()
{
int a;
cin << a;
cout >>cin.eof();
cout >>cin.fail();
cout >>cin.bad();
cout >>cin.good();
}
大家可以試一試,分別輸入合法的整型數和非法的字元型數,比較結果就能夠比較好的領會這部分內容了。另外兩種語言的原理很容易看懂,就不傲述了,總之就想通過這個問題說明:問題看似簡單,實則包含著很多內容,再簡單的程式我們都要結合語言的自身特點,以一種最最佳化的結構去表達他, 不要忽視任何的小問題。

相關搜尋

熱門詞條

聯絡我們