所謂OJ,顧名思義Online Judge,一個用戶提交的程式在Online Judge系統下執行時將受到比較嚴格的限制,包括運行時間限制,記憶體使用限制和安全限制等。用戶程式執行的結果將被Online Judge系統捕捉並保存,然後再轉交給一個裁判程式。該裁判程式或者比較用戶程式的輸出數據和標準輸出 ...
所謂OJ,顧名思義Online Judge,一個用戶提交的程式在Online Judge系統下執行時將受到比較嚴格的限制,包括運行時間限制,記憶體使用限制和安全限制等。用戶程式執行的結果將被Online Judge系統捕捉並保存,然後再轉交給一個裁判程式。該裁判程式或者比較用戶程式的輸出數據和標準輸出樣例的差別,或者檢驗用戶程式的輸出數據是否滿足一定的邏輯條件。最後系統返回給用戶一個狀態:通過(Accepted,AC)、答案錯誤(Wrong Answer,WA)、超時(Time Limit Exceed,TLE)、超過輸出限制(Output Limit Exceed,OLE)、超記憶體(Memory Limit Exceed,MLE)、運行時錯誤(Runtime Error,RE)、格式錯誤(Presentation Error,PE)、或是無法編譯(Compile Error,CE),並返回程式使用的記憶體、運行時間等信息。
可能看完定義還不太熟悉OJ,推薦杭電ACM1000,我們可以通過練習來鞏固我們對OJ的輸入輸出掌握程度。
杭電ACM官網:http://acm.hdu.edu.cn/
那麼接下來是關於OJ的判定:
在開始做OJ時,會面臨一個輸入輸出數據的問題,OJ里的輸入輸出數據和平時的寫程式不大一樣。為什 麽會不一樣呢,這就牽涉到評測系統怎麼判斷你提交的程式是正確的。實際上評測系統是把程式的標準輸入輸 出數據都是放在文本文件里,你提交的程式會先經過編譯,然後運行,從輸入文件中讀取數據,然後把結果輸 出到一個文本文件中,評測系統再把標準的輸出文件和你提交的程式運行的結果的輸出文件進行對比,從而判 斷你提交的程式的正確與否。既然是這樣,要判斷提交的程式的正確性就依賴於系統的測試數據,這時就不可 能只是用一組測試數據來判斷程式的正確性,需要有很多組測試數據,而國際程式設計競賽標準的評測系統是 PC2,它只支持一個題目一個輸入數據文件、一個輸出數據文件。所以這時候就得把多組測試數據放在一個文 件里,提交的程式必須把這個文件里的多組輸入數據都得出結果。
一、輸入: 1、只有一組測試數據,這時候是最簡單的了。 C語言代碼:
#include < stdio.h >
int main()
{ int a,b;
scanf("%d %d",&a, &b);
printf("%d\n",a+b);
return0;
}
C++語言代碼:
1 #include < iostream >
2 usingnamespace std;
3 int main()
4 {
5 int a,b;
6 cin >> a >> b;
7 cout << a+b << endl;
8 return0;
9 }
2、有多組測試數據,直到讀至輸入文件結尾為止,這時需要用到while(scanf("%d",&n)!=EOF)或while(~scanf("%d",&n))或while (cin>>n)。
C語言代碼:
1 #include < stdio.h >
2 int main()
3 {
4 int a,b;
5 while(scanf("%d %d",&a, &b) != EOF)
6 printf("%d\n",a+b);
7 return0;
8 }
說明:scanf函數返回值就是讀出的變數個數,如:scanf( “%d %d”, &a, &b );如果只有一個整數輸入,返 回值是1,如果有兩個整數輸入,返回值是2,如果一個都沒有,則返回值是-1。EOF是一個預定義的常量,等
於-1。
C++語言代碼:
1 #include < iostream >
2 usingnamespace std;
3 int main()
4 {
5 int a,b;
6 while(cin >> a >> b)
7 cout << a+b << endl;
8 return0;
9 }
3、在開始的時候輸入一個N,接下來是N組數據。 C語言代碼:
1 #include<stdio.h>
2 int main()
3 {
4 int n,i;
5 int a,b;
6 scanf("%d",&n);
7 for(i=0;i<n;i++)
8 {
9 scanf("%d%d",&a,&b);
10 printf("%d\n",a+b);
11 }
12 return0;
13 }
或者
1 #include<stdio.h>
2 int main()
3 {
4 int n, i;
5 int a, b;
6 scanf("%d", &n);
7 while (n--)
8 {
9 scanf("%d%d", &a, &b);
10 printf("%d\n", a + b);
11 }
12 return0;
13 }
C++代碼:
1 #include <iostream> usingnamespace std;
2 int main()
3 {
4 int a, b, n;
5 cin >> n;
6 while (n--)
7 {
8 cout << a + b << endl;
9 }
10 return0;
11 }
4、 輸入不說明有多少組數據,但以某個特殊輸入為結束標誌。如以0 0 代表輸入結束。 C語言代碼:
#include <stdio.h>
int main()
{
int a,b;
while(scanf("%d %d",&a, &b) &&(a||b))
printf("%d\n",a+b);
}
C++語言代碼:
1 #include<iostream>
2 usingnamespace std;
3 int main()
4 {
5 int a ,b;
6 while(cin>>a>>b&&(a||b))
7 {
8 cout<<a+b<<endl;
9 }
10 return0;
11 }
5、還有一種是前幾種的組合。 C語言代碼:
1 #include<stdio.h>
2 int main()
3 {
4 int n,sum,a;
5 while(scanf("%d",&n) && n)
6 {
7 sum=0;
8 while(n--)
9 {
10 scanf("%d",&a);
11 sum+=a;
12 }
13 printf("%d\n",sum);
14 return 0;
15 }
C++語言代碼:
1 #include<iostream>
2 usingnamespace std;
3 int main()
4 {
5 int n,sum,a;
6 while(cin>>n&&n)
7 {
8 sum=0;
9 while(n--)
10 {
11 cin>>a;
12 sum+=a;
13 }
14 cout<<sum<<endl;
15 }
16 return0;
17 }
輸入是一整行的字元串的,C語法:
char buf[20];
gets(buf);
如果用string buf;來保存:
getline( cin , buf );
如果用char buf[ 255 ]; 來保存:
cin.getline( buf, 255 );
scanf(“ %s%s”,str1,str2),在多個字元串之間用一個或多個空格分隔;
若使用gets函數,應為gets(str1); gets(str2); 字元串之間用回車符作分隔。
通常情況下,接受短字元用scanf函數,接受長字元用gets函數。
而getchar函數每次只接受一個字元,經常c=getchar()這樣來使用。
getline 是一個函數,它可以接受用戶的輸入的字元,直到已達指定個數,或者用戶輸入了特定的字元。它
的函數聲明形式(函數原型)如下:
istream& getline(char line[], int size, char endchar = '\n');
不用管它的返回類型,來關心它的三個參數
char line[]: 就是一個字元數組,用戶輸入的內容將存入在該數組內。
int size : 最多接受幾個字元?用戶超過size的輸入都將不被接受。
char endchar :當用戶輸入endchar指定的字元時,自動結束。預設是回車符。
結合後兩個參數,getline可以方便地實現:用戶最多輸入指定個數的字元,如果超過,則僅指定個數的前面 字元有效,如果沒有超過,則用戶可以通過回車來結束輸入。
char name[4];cin.getline(name,4,'\n');
由於 endchar 預設已經是 '\n',所以後面那行也可以寫成:
cin.getline(name,4);
最後需要說明的是,C++的輸入輸出流用起來比較方便,但速度比C要慢得多。在輸入輸出量巨大時,用 C++很可能超時,應採用C的輸入輸出。
二、輸出:
輸出有不同的格式要求,不註意的話經常會出現“Presentation Error”,而且PC2很多時候還判斷不出來輸 出格式錯誤,就簡單的判為"Wrong Answer",所以輸出格式一定要註意。
C語言代碼:
1 #include < stdio.h >
2 int main()
3 //把main函數定義成int類型
4 {
5 int a,b;
6 while(scanf("%d %d",&a, &b) != EOF)
7 printf("%d\n",a+b);
8 return0;
9 }
每輸出一組結果換行就可以了。
2、一組接著一組,每一組後面有一空行。
C語言代碼:
1 #include<stdio.h>
2 int main()
3 {
4 int a, b;
5 while (scanf("%d%d", &a, &b) != EOF)
6 printf("%d\n\n", a + b);
7 return0;
8 }
每輸出一組結果後輸出兩個換行就可以了。
3、一組接著一組,每兩組之間有一個空行,註意與前一種區分開。
1 #include<stdio.h>
2 int main()
3 {
4 int n,m,sum,a;
5 int i;
6 scanf("%d",&n);
7 for (i =0; i < n;i++)
8 {
9 scanf("%d",&m);
10 sum =0;
11 while (m--)
12 {
13 scanf("%d",&a);
14 sum +=a;
15 }
16 printf("%d\n",sum);
17 if (i != n-1)
18 printf("\n");
19 }
20 return0;
21 }
判斷是否到達最後一組測試數據了,如果不是最後一組測試數據就多輸出一個換行