什么是OJ,是做什么的?
常見(jiàn)的ACM、藍(lán)橋杯、甚至NOIP等主流比賽中,無(wú)論實(shí)時(shí)出結(jié)果還是賽后統(tǒng)一評(píng)測(cè),幾乎都是以O(shè)J作為評(píng)測(cè)系統(tǒng)的,即非人工主導(dǎo),機(jī)器自主評(píng)測(cè)。這就是OJ - 全稱(chēng)為OnlineJudge,即在線(xiàn)評(píng)測(cè)系統(tǒng)
由于程序設(shè)計(jì)類(lèi)比賽,不僅僅要驗(yàn)證程序的正確與否,還要進(jìn)行語(yǔ)法編譯檢測(cè)、內(nèi)存、時(shí)間的檢測(cè)等等,人工也很難做到,因此也只能使用OJ評(píng)測(cè),
OJ的工作原理
OJ采用后臺(tái)黑箱測(cè)試的原理,即測(cè)試比對(duì)結(jié)果的方式,而測(cè)試數(shù)據(jù)非常全面,涵蓋各種特殊情況。并且在結(jié)果的比對(duì)上也不放過(guò)一個(gè)空格和回車(chē),這就要求程序員要有非常嚴(yán)謹(jǐn)?shù)乃季S。因此程序中一旦有多余的輸出信息,都將認(rèn)為答案錯(cuò)誤。
常見(jiàn)的問(wèn)題例如,新手學(xué)習(xí)編程常常會(huì)寫(xiě):
printf("Please input:");
等等類(lèi)似的語(yǔ)句,殊不知程序在交由OJ評(píng)測(cè)后,這一行輸出的內(nèi)容"Please input:"也會(huì)作為程序的答案一部分進(jìn)行比對(duì),結(jié)果可想而知。即便答案是對(duì)的,也逃脫不了0分未通過(guò)的結(jié)果。
正常一道題目的題面信息,我們會(huì)看到題目描述、輸入格式、輸出格式、樣例輸入、樣例輸出等幾部分。
其中的樣例輸入和輸出就是用來(lái)讓你驗(yàn)證理解題意的例子,并非只處理這組數(shù)據(jù)(那題也太簡(jiǎn)單了),真正提交程序后的評(píng)測(cè),可能會(huì)有十組甚至二十組、五十組的數(shù)據(jù)等著程序比對(duì),例如a+b的問(wèn)題,測(cè)試數(shù)據(jù)很可能不僅僅測(cè)1+1=2的結(jié)果,還會(huì)測(cè)測(cè)99+1=100這種有進(jìn)位的數(shù)據(jù),還會(huì)測(cè)20 0000 0000+10 0000 0000 = 30 0000 0000 這樣的超int范圍數(shù)據(jù)等等,大量常規(guī)數(shù)據(jù)、特殊值、邊界值等著你,一旦有一組數(shù)據(jù)沒(méi)有通過(guò)。ACM這樣的比賽就會(huì)錯(cuò)誤,藍(lán)橋杯這樣的比賽只能拿部分分?jǐn)?shù)了
市面上常見(jiàn)的OJ有很多,比如北大的POJ,杭電的HOJ,以及國(guó)外的UVA等等,雖然ACM、藍(lán)橋杯、NOIP不同的比賽的題目基本是相通的,都可以刷題使用,但ACM類(lèi)的OJ通常是英文居多,其余比賽中文居多。難度定位也略有不同。
例如Dotcpp,是面向編程初學(xué)者,兼顧算法數(shù)據(jù)結(jié)構(gòu)的輕量級(jí)中文OJ
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫(xiě)的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫(xiě)出一個(gè)爬蟲(chóng)的Python編程課程
只會(huì)語(yǔ)法寫(xiě)不出代碼?手把手帶你寫(xiě)100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門(mén)課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程