官术网_书友最值得收藏!

1.5 藍橋杯軟件類大賽的評測系統

本書的例題和習題選自藍橋杯大賽官網題庫(在本書中簡稱lanqiaoOJ),lanqiaoOJ中有歷年真題和一些訓練題。

lanqiaoOJ里面的“判題機器人”如何判斷你提交的代碼是否正確?

能否直接通過看代碼的方式,檢查每一行代碼的邏輯的正確性?這幾乎是不可能實現的,因為看別人的代碼極其痛苦,往往會讓人暈頭轉向。即使是常年進行計算機編程教學的老師在檢查別人的代碼時也不例外,像程序設計這樣的題目,如果改卷的老師不是用機器驗證,而是手動批閱,將很難打分。

所以lanqiaoOJ中的“判題機器人”如果看不懂你提交的代碼,它干脆就不看代碼,而是直接檢驗你提交代碼的正確性。這一方法簡單粗暴(即用黑盒測試),步驟如下。

(1)準備好標準測試數據,包括輸入data.in和對應的輸出data.out。

(2)運行你提交的代碼,讀入輸入數據data.in,產生輸出數據my.out。

(3)如果超出限定時間,代碼還沒運行結束,那就是沒有產生輸出,則判錯。

(4)對比data.out和my.out,如果完全一樣,則判為正確,否則判錯。

藍橋杯軟件類大賽的判題規則允許選手得部分分數。一道題包含多組測試數據,一般是10組,每組占10%的分數。有的測試數據比較簡單,容易通過,能夠讓選手得一些分數。

下面說明lanqiaoOJ的使用方法。輸入鏈接地址(www.lanqiao.cn/problems)之后,出現圖1.1所示的頁面,單擊“標簽”,然后按“年份”或其他算法分類查詢題目。

圖1.1 lanqiaoOJ題庫

做lanqiaoOJ中的題目時,需要輸入相應的代碼讓“判題機器人”判斷。下面分別就結果填空題(以下簡稱填空題)和編程大題舉例說明。

1.結果填空題

例題1-1.平方和

2019年(第十屆)省賽,填空題,lanqiaoOJ題號599

【題目描述】小明對數位中含有2、0、1、9的數字很感興趣,在1到40中這樣的數包括1、2、9、10至32、39和40,共28個,它們的和是574,平方和是14362。注意,平方和是指將每個數分別平方后求和的結果。請問,在1到2019中,所有這樣的數的平方和是多少?

? 提示:這一題的鏈接是https://www.lanqiao.cn/problems/599/learning/,題號599。本書后面的題目只給出題號,省略完整的鏈接。

這是一道填空題,只需要寫出答案即可,不過仍需要編寫代碼以求得答案,這一題的求解過程參見2.1.4小節“巧用Python”中的例題2-12“平方和”。

(1)編寫并提交代碼。這一題的答案是2658417853,在lanqiaoOJ中的測試方法如圖1.2所示。

圖1.2 測試lanqiaoOJ 599題

單擊頁面下方的“提交檢測”,系統返回測試結果。

(2)查看錯誤提示。單擊頁面左邊的時鐘符號,可以看到自己提交的這一題的記錄,如圖1.3所示。單擊“FAIL”可以看到判題說明。

圖1.3 lanqiaoOJ 599題的測試記錄

(3)看題解。lanqiaoOJ的一個優點是提供了題解功能,能看到其他人的題解。單擊頁面左邊的“答 題解”,可以看到此題的各種編程語言的題解,非常方便。單擊此題的“Python3”題解,可以看到有123個題解,如圖1.4所示。讀者做題后也可以發布自己的題解,方便別人學習你的解題思路。

圖1.4 lanqiaoOJ 599題的“Python3”題解

2.編程大題

編程大題有多組測試數據。下面用一道題說明“判題機器人”如何用這些數據測試出你的代碼的正確性。

例題1-2.刷題統計

2022年(第十三屆)省賽,lanqiaoOJ題號2098

時間限制:1s 內存限制:256MB

【題目描述】小明決定從下周一開始努力刷題準備藍橋杯競賽。他計劃周一至周五每天做a道題,周六和周日每天做b道題。請你幫小明計算,按照計劃他將在第幾天實現做題數大于等于n題?

【輸入格式】輸入一行,包含3個整數abn

【輸出格式】輸出一個整數代表天數。

【評測用例規模與約定】對于50%的評測用例,1≤a, b, n≤106;對于100%的評測用例,1≤a, b, n≤1018

下面的代碼可以簡單地模擬題目的操作:周六、周日每天做b道題,周一到周五每天做a道題,累計到n題時輸出天數。

 1  #include<bits/stdc++.h>
 2  using namespace std;
 3  int main(){
 4      long long a,b,n;   cin>>a>>b>>n;    //注意用long long
 5      long long sum=0,day=0;
 6      while(sum<=n){
 7          day++;
 8          if(day%7==6||day%7==0) sum+=b; //周六、周日每天做b道題
 9          else                   sum+=a; //周一至周五每天做a道題
10      }
11      cout << day;
12  }

提交代碼后,只能通過50%的測試。這意味著若是10分的題,只能得到5分。

為什么只能通過50%的測試?因為代碼的運行效率低。在while循環中,每循環一次,day加1,所做題目數量累加為sum,直到sum>n,這樣做效率非常低。本題要求“時間限制:1s”,對于100%的數據,1≤a, b, n≤1018,上面代碼的運行時間顯然會超過1s。

判題機器人會將超時的代碼判為“錯誤”,例如下面這組測試數據:

7089 7494 500000014592.

答案是69399007,即while循環了69399007次,運行時間約2s,超時了。

這一題如果要100%通過測試,可參見8.1節“模運算”中關于該題的解析。

主站蜘蛛池模板: 枣强县| 黄骅市| 洪泽县| 莱阳市| 闻喜县| 漯河市| 崇左市| 中牟县| 潍坊市| 中江县| 邹平县| 攀枝花市| 崇信县| 荔波县| 永定县| 大同市| 雅江县| 阿图什市| 阳西县| 石柱| 新蔡县| 托克逊县| 上蔡县| 陇南市| 洪泽县| 会同县| 综艺| 内黄县| 白河县| 公主岭市| 遂宁市| 张北县| 日喀则市| 宁河县| 嫩江县| 汝城县| 岑溪市| 嵩明县| 秦安县| 呼伦贝尔市| 绵阳市|