1. 程式人生 > >程式設計能力提高--------ACM/OJ機試快速入門篇

程式設計能力提高--------ACM/OJ機試快速入門篇

目錄:

1、OJ上做題,可能遇到的反饋資訊及其原因分析

2、EOF詳解(OJ入門必須理解之)

3:OJ系統推薦

進入正題============》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

一、可能收到的反饋資訊包括:

1、Compile Error :程式不能通過編譯。

      程式碼本身語法、程式碼中使用某些庫函式卻沒新增標頭檔案。我們可以根據反饋回來的編譯錯誤資訊來改正這些錯誤。

2、Runtime Error :程式執行過程中出現非正常中斷。

      這是程式碼編譯正常情況下,執行時出錯了。一般遇到這種情況,應檢查一下幾個方面:(1)程式碼中的陣列是否足夠長,以防開闢的空間不足以儲存資料。特別注意的是字串結束符’\0’也需要佔用一個單位的陣列空間。(2)檢查程式碼中是否存在記憶體空間誤用。陣列越界等情況。(3)指標使用不當,沒有初始化或者指標指向的位置與本程式無關,都會造成執行錯誤。

3、Time Limit Exceeded:執行超過時限還沒有得到輸出結果。

      每個上機的題目都有一個時間限制,比如1s。一般碰到時間超限應該對自己的程式碼進行以下幾個方面的檢測:(1)程式碼中是否使用freopen這個庫函式,這個函式進行本地的檔案輸入,提交程式碼前一定把它刪掉,否則就會造成時間超限。(2)有限情況下用scanf輸入的時候,要判斷其返回值是不是等於EOF,也就是判斷是不是讀到了檔案尾。如果該使用EOF的時候沒有用它,可能造成超限。(3)所選擇的演算法的效率也是造成超時的一個重要原因,應該對已有的程式碼進行優化;比如程式碼中有一些需要重複用到的計算結果,那麼最好分配陣列或變數將他們儲存下來,在下次用的時候直接拿來用就可以了,不用再算一遍。以斐波那契數列來說,若用遞迴方式求解,往往就會超時。所以程式碼中如果用到遞迴,那麼很有可能因為遞迴的層數太多而超時。應儘量不用遞迴方法,如果真的需要用到遞迴,也要對遞迴呼叫做優化,減少遞迴層數。(4)當代碼中使用迴圈的時候,往往會因為迴圈變數設定不當,沒有累加,或者判定條件沒有設定正確造成時間超限,應該思考迴圈跳出的臨界情況。

4、Wrong Answer :答案錯誤。

      (1)檢查是否安裝題目要求的格式輸出結果,輸出的大小寫是否正確。如題目要求輸出“Yes”,而你輸出的是“yes”。

      (2)檢查你的程式碼是不是按照多組測試資料來編寫的。在程式碼處理多組測試資料的時候,有些變數要在進行下一次資料處理之前還原為原先的初始值,如果沒有還原,那麼也可能得到錯誤的答案。

5、PresentationError :輸出格式不對

      可檢查空格、回車等等細節。很多題目要求輸出的n個數據或資料塊之間是n-1個空格或空行隔開。

      如何控制空格或者空行的輸出呢?有兩種方式可供選擇,一種是在資料之前輸出空格,那麼在每行的第一個資料之前不應該輸出空格;另一種方式是在資料之後輸出空格,那麼在每行的最後一個數據之後不應該輸出空格。

第一種控制方案如下:

for(int i=0;i<n;i++)
{
    if(i)//利用迴圈變數第一次為0,而往後均大於0這一特點。
    {
        putchar(' ');
    }
    //輸出其他資料
}
第二種控制方案如下:
for(int i=0;i<n;i++)
{
    //if之前按要求輸出資料
    if(i!=n-1)//最後一個元素不再輸出空格
    {
        putchar(' ');
    }
}

第三種控制方案如下:

int first=1;    //標誌變數
for(int i=0; i<maxn; i++)
{
    if(first)
        first=0;
    else
        printf(" ");
    printf("%d",a[i]); //輸出數組裡的元素
}


6、Accepted :評測結果正確。恭喜恭喜!

二、EOF詳解

      在上機考試時,有很多時候題目並沒有告訴你具體要輸入多少組資料,這個時候就要用到EOF(end of file)這個東西,也就是檔案尾。系統的測試資料都是放在檔案中的,因此,如果題目沒有具體說明輸入多少組資料時,肯定是指要遇到檔案尾才能結束。EOF是一個預定義的常量,等於-1。scanf函式返回值就是讀出的變數個數,如:scanf( “%d%d”, &a, &b );如果只有一個整數輸入,返回值是1,如果有兩個整數輸入,返回值是2,如果一個都沒有,則返回值是-1。

//C語法格式:
         while(scanf("%d%d",&a,&b) != EOF)
         {     .... }
//C++語法格式:
while( cin>> a >> b )
{    ....      }
//很多OJ系統的第一題,兩數求和
#include <stdio.h>
int main()
 {
    int a,b;
    while(scanf("%d%d",&a, &b) != EOF)
        printf("%d\n",a+b);
 }


三、OJ系統推薦

1、北京大學的OJ。POJ上面的題目有點老了,但好處是做的人多,經典演算法題多,解題報告也多,適合上手。http://poj.org//

5、九度OJ:裡面含有各大高校歷年考研複試上機題目,對於準備複試的同學很有用。

6、找工作、找實習的同學可以去Leetcode和牛客網刷題,很多大公司的面試和機試題目。

相關推薦

程式設計能力提高--------ACM/OJ快速入門

目錄: 1、OJ上做題,可能遇到的反饋資訊及其原因分析 2、EOF詳解(OJ入門必須理解之) 3:OJ系統推薦 進入正題============》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》 一、可能收到的反饋資訊包括: 1、Compile Er

尋找01矩陣中的最大子矩陣--華為OJ--java語言版

題目描述: 在一個M * N的矩陣中,所有的元素只有0和1,從這個矩陣中找出一個面積最大的全1子矩陣,所謂最大是指元素1的個數最多。 輸入: 輸入可能包含多個測試樣例。 對於每個測試案例,輸入的第一行

程式設計能力提高------蛇形填數(方塊填數+三角形填數)

回憶曾經: 考研複試上機做題時,遇到過一次這個蛇形填數問題,當時不會做;後來又遇到一個蛇形填充(基於三角形),也不會做;這讓我下定決心,一定要找到這兩個問題的解。後來才知道,這種問題,是學習ACM的入門問題。 蛇形填數(一)蛇形矩陣 問題一:描述  以下內容參考《

U3D_Shader程式設計(第一快速入門

《U3D_Shader程式設計》##《U3D_Shader程式設計》釋出說明:++++Shader一個高大上的領域,不管怎麼樣,我來了。++++立鑽哥哥從2018年開始正式對Shader進行戰略佈局。++++《U3D_Shader程式設計》將從零開始,循序漸進探索,還是先探索

正則表示式之快速入門

前言 此篇隨筆,參考了鼎鼎大名的《正則表示式30分鐘入門》,原帖地址:http://deerchao.net/tutorials/regex/regex.htm 建議初學者可以玩玩正則表示式圖解網站和表示式測試網站,可以更加直觀的瞭解自己書寫的正則表示式結構和作用。他們分別是 圖解網站 

Spring Boot -01- 快速入門(圖文教程)

Spring Boot -01- 快速入門篇(圖文教程) 今天開始不斷整理 Spring Boot 2.0 版本學習筆記,大家可以在部落格看到我的筆記,然後大家想看視訊課程也可以到【慕課網】手機 app,去找【Spring Boot 2.0 深度實踐】的課程,令人開心的是,課程完全免費! 什麼是 Spri

Elasticsearch頂尖高手系列-快速入門

01.課程介紹02.用大白話告訴你什麼是Elasticsearch03.Elasticsearch的功能、適用場景以及特點介紹04.手工畫圖剖析Elasticsearch核心概念:NRT、索引、分片、副本等05.在windows上安裝和啟動Elasticseach06.快速入門案例實戰之電商網站商品管理:叢集

UML類圖快速入門

1、關聯 雙向關聯: C1-C2:指雙方都知道對方的存在,都可以呼叫對方的公共屬性和方法。 在GOF的設計模式書上是這樣描述的:雖然在分析階段這種關係是適用的,但我們覺得它對於描述設計模式內的類關係來說顯得太抽象了,因為在設計階段關聯關係必須被對映為物件引用或指標。物件引

Java之Java快速入門

你好,世界! 原始碼組織方式 Java程式由package+class組成,package對應目錄的相對路徑,class對應檔案,如 E:WorkspacesMyEclipse 10JavaStudysrccomhappyframeworkjavastudyhelloHello.java

PaddlePaddle-快速入門

本博主最近在準備學習入手百度的深度學習架構-PaddlePaddle,本部落格是本博主在學習的過程中的一些心得,寫下是為了分享一些自己的心得,也是為了方便自己以後檢視。本文章主要針對PaddlePaddle上的快速入門案例的講解,地址為:http://paddlepaddle

Python學習筆記(一):基礎語法、變數型別、運算子(快速入門

Head First Python、Python基礎教程 下劃線的特殊意義 以下劃線開頭的識別符號是有特殊意義的。 以單下劃線開頭(_foo)的代表不能直接訪問的類屬性,需通過類提供的介面進行訪問,不能用”from xxx import *”而匯入

資料結構與演算法(Python)-Python快速入門3

寫在前面 對於簡單的任務,我們可以利用一些函式,按照任務處理的流程書寫程式碼來完成需求,這種方式稱之為程序式程式設計(procedural programming);但是對於複雜的系統,如何有條理的將每個模組的程式碼內聚起來,如何清晰和簡潔地表達各個模組之間的

TP5快速入門(框架結構)

一、目錄結構|-application 應用目錄(幾乎整個專案的內容都寫在這裡)|-index(這裡的資料夾tp5叫做模組-----一般是前臺模組,也可以根據需要需求修改成其他(例如:home),需要修改配置檔案,修改預設模組、控制器、操作)  【注】:TP5預設只有一個in

JVM基礎快速入門

Java是一門可以跨平臺的語言,但是Java本身是不可以實現跨平臺的,需要JVM實現跨平臺。javac編譯好後的class檔案,在Windows、Linux、Mac等系統上,只要該系統安裝對應的Java虛擬機器,class檔案都可以執行。達到”一次編譯,到處執行”的效果。 一、JVM是什麼? 而JVM到底是什

程式設計師如何快速提高程式設計能力?快來看大牛的方法!

如果你想提高編碼的能力,最容易想到的一個方法就是多敲程式碼。每個人都知道這點。然而,另外一種我認為絕對也能提高的方法: 閱讀別人的程式碼能讓你的編碼能力得到明顯的提升! 這樣說,可能很多人都抱有懷疑的態度,但是我覺得你應該相信。如果你願意嘗試,我相信你將會得到巨大的回報! 這篇文章

快速提高程式設計能力---一年時間可以改變很多事

先說明一下,這篇文章寫給那些本身是計算機專業但是由於前幾年沒有學習,到了大三、大四迷茫困惑不知道如何下手去學的同學,還有一些想學程式設計但是面對巨多的語言和技術不知道從何下手的新手朋友。假如你是我所說的這兩種人,請你耐心看完這篇文章,它會幫你少走很多的彎路,一年的時間可以可

一種提高單片i/o口驅動能力的方法

water clas aik eas 發現 strong img white .net 一、簡述問題 當你用單片驅動發光二極管的時,你還感覺不到P0、P1口的差別。(10-20mA之間,當中P0驅動能力最強,但對於驅動直流電機依舊非常弱。其結果就是電機不轉)。那麽

我們應該怎樣來提高自己的程式設計能力

    故天將降大任於是人也,必先苦其心志,勞其筋骨,餓其體膚,空乏其身,行拂亂其所為,所以動心忍性,曾益其所不能。      --《孟子》        我曾經很是厭倦敲程式碼的日子,因為覺得,

牛客網 - 線上程式設計 - 華為 - 合併表記錄

題目描述 資料表記錄包含表索引和數值,請對錶索引相同的記錄進行合併,即將相同索引的數值進行求和運算,輸出按照key值升序進行輸出。 輸入描述: 先輸入鍵值對的個數 然後輸入成對的index和value值,以空格隔開 輸出描述: 輸出合併後的鍵值對(多

牛客網 - 線上程式設計 - 華為 - 字串字典順序排序

題目描述 給定n個字串,請對n個字串按照字典序排列。 輸入描述: 輸入第一行為一個正整數n(1≤n≤1000),下面n行為n個字串(字串長度≤100),字串中只含有大小寫字母。 輸出描述: 資料輸出n行,輸出結果為按照字典序排列的字串。 示例1