ACM入門之OJ~

来源:https://www.cnblogs.com/lightice/archive/2019/01/09/10246947.html
-Advertisement-
Play Games

所謂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  }     

判斷是否到達最後一組測試數據了,如果不是最後一組測試數據就多輸出一個換行


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 例:輸入三個整數,輸出最大值和最小值。 #include<stdio.h>int main(){ int a,b,c,max,min; printf("input three numbers:"); scanf("%d%d%d",&a,&b,&c); if(a>b) {max=a;min=b;} e ...
  • 1.多線程數據安全 線程同步:多個線程需要訪問同一資源時,需要以某種順序來確定該資源某一時刻只能被一個線程使用。 2.同步代碼塊實現同步(部分代碼的訪問,我們希望它同步) package com.test; public class ThreadDemo1 { public static void ...
  • 題意 "題目鏈接" Sol 發現abcdef是互不相關的 那麼meet in the middle一下。先算出abc的,再算def的 註意d = 0的時候不合法(害我wa了兩發。。) cpp include define LL long long using namespace std; const ...
  • 一: BeautifulSoup的安裝: 下載地址:https://www.crummy.com/software/BeautifulSoup/bs4/download/4.6/ 下載後,解壓縮,然後放到Python目錄中。 我是Windows安裝Python3.6,目錄:D:\Python\Pyt ...
  • 題意 "題目鏈接" Sol 把前一半放在左邊,後一半放在右邊 meet in the middle一波 統計答案的時候開始想的是hash,然而MLE了兩個點 實際上只要排序之後雙指針掃一遍就行了 cpp include using namespace std; const int MAXN = 7, ...
  • enums枚舉是值類型,數據直接存儲在棧中,而不是使用引用和真實數據的隔離方式來存儲。 (1)預設情況下,枚舉中的第一個變數被賦值為0,其他的變數的值按定義的順序來遞增(0,12,3...),因此以下兩個代碼定義是等價的: enum TrafficLight { Green, Yellow, Red ...
  • 表達式目錄樹 1.什麼是表達式目錄樹Expression? 表達式目錄樹是一個數據結構,語法樹。 首先我們去看看 Expressions類 ,定義了一個泛型委托類型 TDelegate: 我們先來一個帶返回值的委托: 其中m、n是兩個Int 類型的參數 通過表達式目錄樹計算 m*n+2: 通過中間語 ...
  • 工具是使用AES-256-CBC加密演算法 問題 最近有客戶反映, 在使用我們工具時候,會出現“調用的目標發生了異常”錯誤, 接到反饋之後, 我們進行了很多測試,甚至得到客戶系統信息和framework版本, 但是都沒有得到復現。測試,debug,log列印各種嘗試,無果。 **報錯信息顯示:** 原 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...