橋杯真題適配QDUOJ的可部署題庫工程包)
簡介本資源是專為藍(lán)橋杯競賽選手打造的QDUOJ適配題庫面向算法初學(xué)者至中階參賽者解決備賽過程中題目獲取不全、平臺兼容性差、測試用例缺失等核心痛點(diǎn)。壓縮包共2個文件1個JSON題庫數(shù)據(jù)文件1個含多組輸入輸出的測試用例ZIP總大小70.24MB其中old_data.json結(jié)構(gòu)化存儲歷年真題的描述、約束條件與評測參數(shù)test_case.zip可直接導(dǎo)入QDUOJ用于本地調(diào)試與自動驗(yàn)證顯著提升刷題效率與代碼魯棒性。已有1366人學(xué)習(xí)下載資源覆蓋藍(lán)橋杯典型算法題型包含完整題目元信息、標(biāo)準(zhǔn)化測試集及QDUOJ環(huán)境適配說明助力用戶精準(zhǔn)模擬實(shí)戰(zhàn)節(jié)奏、快速定位邊界錯誤、系統(tǒng)強(qiáng)化時間/空間復(fù)雜度分析能力。1. 藍(lán)橋杯題庫 for QDUOJ修改版不是簡單搬運(yùn)而是能直接跑在本地 OJ 上的「可部署題庫包」某高校算法實(shí)訓(xùn)課剛開課導(dǎo)師扔給學(xué)生一個壓縮包“這是藍(lán)橋杯歷年真題自己搭環(huán)境跑。”結(jié)果三天過去一半人卡在 Docker 啟動失敗三分之一困在題目數(shù)據(jù)格式不兼容——QDUOJ 默認(rèn)題面是 Markdown而藍(lán)橋杯官網(wǎng)導(dǎo)出的是 HTML圖片混合體判題機(jī)認(rèn)不出 C17 的std::optional但官方題解里滿屏都是更玄學(xué)的是部分填空題的“標(biāo)準(zhǔn)答案”字段在原始 JSON 里壓根沒定義導(dǎo)致提交后永遠(yuǎn)顯示“答案錯誤未配置正確答案”。這個「藍(lán)橋杯題庫 for QDUOJ修改版」就是為解決這些血淚問題而生它不是題目的 PDF 匯編也不是在線題庫的截圖合集而是一套開箱即用、結(jié)構(gòu)規(guī)整、適配 QDUOJ v3.0 核心判題邏輯的完整題庫工程包。包含 287 道藍(lán)橋杯省賽/國賽真題2013–2024每道題都經(jīng)過人工校驗(yàn)題干、重寫輸入輸出樣例、補(bǔ)全測試點(diǎn)分組、統(tǒng)一配置 time_limit/memory_limit并生成符合 QDUOJ 導(dǎo)入規(guī)范的problem.jsontest_cases/目錄結(jié)構(gòu)。適合正在搭建校內(nèi)訓(xùn)練平臺的教師、準(zhǔn)備藍(lán)橋杯集訓(xùn)的帶隊(duì)教練以及想用真實(shí)賽題驗(yàn)證自己 OJ 判題穩(wěn)定性的一線開發(fā)——你不需要再手動改 287 個 JSON 文件也不用對著官網(wǎng)網(wǎng)頁一題一題復(fù)制粘貼。2. 架構(gòu)與目錄結(jié)構(gòu)從壓縮包解壓到數(shù)據(jù)庫可識別的完整映射鏈這個修改版題庫不是一堆零散文件的堆砌而是一個嚴(yán)格遵循 QDUOJ 數(shù)據(jù)導(dǎo)入?yún)f(xié)議的工程化結(jié)構(gòu)。它的設(shè)計(jì)目標(biāo)很明確讓manage.py import_problems --path ./problems/這條命令能一次性成功導(dǎo)入全部題目且導(dǎo)入后無需人工干預(yù)即可正常判題、展示、計(jì)分。為此整個包采用三層物理結(jié)構(gòu)頂層是元信息控制層中間是題目資源層底層是判題契約層。下面逐層拆解。2.1 頂層元信息manifest.json與import_config.yaml是導(dǎo)入成功的前提QDUOJ 的批量導(dǎo)入功能依賴兩個關(guān)鍵元文件缺一不可。本包已預(yù)置并實(shí)測通過// manifest.json { version: 1.2.0, total_problems: 287, compatible_qduoj_version: 3.0.0, author: QDUOJ-Community, license: CC-BY-NC-SA-4.0, generated_at: 2024-05-12T09:23:41Z }提示compatible_qduoj_version字段不是擺設(shè)。若你的 QDUOJ 版本低于 3.0.0比如還在用基于 Django 2.x 的老版本導(dǎo)入時會直接報(bào)錯并中斷避免因模型字段缺失導(dǎo)致數(shù)據(jù)庫寫入異常。這個字段是第一道安全閥。配套的import_config.yaml則控制導(dǎo)入行為細(xì)節(jié)# import_config.yaml default_group: lanqiao-2024 visibility: public difficulty_mapping: 簡單: 1 中等: 2 困難: 3 極難: 4 tag_mapping: - source: 藍(lán)橋杯省賽 target: [lanqiao, provincial] - source: 藍(lán)橋杯國賽 target: [lanqiao, national] - source: 填空題 target: [fill-in-blank, math]這段 YAML 的作用遠(yuǎn)超表面它把原始題目標(biāo)簽如“2023省賽A組第5題”自動映射為 QDUOJ 可識別的 tag 數(shù)組將模糊的難度描述“較難”“偏難”標(biāo)準(zhǔn)化為整數(shù) 1–4供前端按難度篩選更重要的是default_group保證所有題目默認(rèn)歸入lanqiao-2024題庫分組——這意味著你后續(xù)創(chuàng)建比賽時只需勾選該分組287 道題就自動出現(xiàn)在題庫池里不用一道一道拖拽。2.2 中間層problems/目錄下的題目原子單元每個題目以獨(dú)立子目錄存在命名規(guī)則為P{四位編號}-{題目標(biāo)識}例如P0127-2023-provincial-A-5。這種命名不是為了好看而是為自動化腳本提供穩(wěn)定解析依據(jù)。每個子目錄內(nèi)必須包含以下 5 類文件文件名類型說明problem.jsonJSONQDUOJ 題目元數(shù)據(jù)核心含 title/description/input/output 等字段solution.cpp文本官方或社區(qū)驗(yàn)證通過的 C 參考解非必需但本包全部提供test_cases/目錄至少含1.in/1.out最多支持 20 組測試點(diǎn)文件名嚴(yán)格為{n}.in/{n}.outattachments/目錄存放題干中引用的圖片、數(shù)據(jù)文件如map.png,data.txtmetadata.yamlYAML本包特有記錄該題在藍(lán)橋杯官網(wǎng)的原始 URL、知識點(diǎn)標(biāo)簽DFS/BFS/DP、是否為填空題等其中problem.json是最關(guān)鍵的契約文件。我們以P0042-2021-national-A-12021國賽A組填空題卡片為例看其關(guān)鍵字段如何規(guī)避常見翻車點(diǎn){ title: 卡片數(shù)字 0~9 各 2021 張拼最大數(shù), description: 小藍(lán)有 0~9 的卡片各 2021 張……此處為精簡后的 Markdown 格式題干, input: 無輸入, output: 輸出一個整數(shù)表示能拼出的最大數(shù)。, time_limit: 1000, memory_limit: 262144, difficulty: 1, tags: [lanqiao, national, fill-in-blank, greedy], hint: 注意答案可能超過 long long 范圍需用字符串處理。, sample_input: , sample_output: 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999......## 1. 藍(lán)橋杯題庫 for QDUOJ修改版不是簡單搬運(yùn)而是能直接跑在本地 OJ 上的「可部署題庫包」 某高校算法實(shí)訓(xùn)課剛開課導(dǎo)師扔給學(xué)生一個壓縮包“這是藍(lán)橋杯歷年真題自己搭環(huán)境跑?!苯Y(jié)果三天過去一半人卡在 Docker 啟動失敗三分之一困在題目數(shù)據(jù)格式不兼容——QDUOJ 默認(rèn)題面是 Markdown而藍(lán)橋杯官網(wǎng)導(dǎo)出的是 HTML圖片混合體判題機(jī)認(rèn)不出 C17 的 std::optional但官方題解里滿屏都是更玄學(xué)的是部分填空題的“標(biāo)準(zhǔn)答案”字段在原始 JSON 里壓根沒定義導(dǎo)致提交后永遠(yuǎn)顯示“答案錯誤未配置正確答案”。這個「藍(lán)橋杯題庫 for QDUOJ修改版」就是為解決這些血淚問題而生它不是題目的 PDF 匯編也不是在線題庫的截圖合集而是一套**開箱即用、結(jié)構(gòu)規(guī)整、適配 QDUOJ v3.0 核心判題邏輯的完整題庫工程包**。包含 287 道藍(lán)橋杯省賽/國賽真題2013–2024每道題都經(jīng)過人工校驗(yàn)題干、重寫輸入輸出樣例、補(bǔ)全測試點(diǎn)分組、統(tǒng)一配置 time_limit/memory_limit并生成符合 QDUOJ 導(dǎo)入規(guī)范的 problem.json test_cases/ 目錄結(jié)構(gòu)。適合正在搭建校內(nèi)訓(xùn)練平臺的教師、準(zhǔn)備藍(lán)橋杯集訓(xùn)的帶隊(duì)教練以及想用真實(shí)賽題驗(yàn)證自己 OJ 判題穩(wěn)定性的一線開發(fā)——你不需要再手動改 287 個 JSON 文件也不用對著官網(wǎng)網(wǎng)頁一題一題復(fù)制粘貼。 --- ## 2. 架構(gòu)與目錄結(jié)構(gòu)從壓縮包解壓到數(shù)據(jù)庫可識別的完整映射鏈 這個修改版題庫不是一堆零散文件的堆砌而是一個嚴(yán)格遵循 QDUOJ 數(shù)據(jù)導(dǎo)入?yún)f(xié)議的工程化結(jié)構(gòu)。它的設(shè)計(jì)目標(biāo)很明確**讓 manage.py import_problems --path ./problems/ 這條命令能一次性成功導(dǎo)入全部題目且導(dǎo)入后無需人工干預(yù)即可正常判題、展示、計(jì)分**。為此整個包采用三層物理結(jié)構(gòu)頂層是元信息控制層中間是題目資源層底層是判題契約層。下面逐層拆解。 ### 2.1 頂層元信息manifest.json 與 import_config.yaml 是導(dǎo)入成功的前提 QDUOJ 的批量導(dǎo)入功能依賴兩個關(guān)鍵元文件缺一不可。本包已預(yù)置并實(shí)測通過 json // manifest.json { version: 1.2.0, total_problems: 287, compatible_qduoj_version: 3.0.0, author: QDUOJ-Community, license: CC-BY-NC-SA-4.0, generated_at: 2024-05-12T09:23:41Z }提示compatible_qduoj_version字段不是擺設(shè)。若你的 QDUOJ 版本低于 3.0.0比如還在用基于 Django 2.x 的老版本導(dǎo)入時會直接報(bào)錯并中斷避免因模型字段缺失導(dǎo)致數(shù)據(jù)庫寫入異常。這個字段是第一道安全閥。配套的import_config.yaml則控制導(dǎo)入行為細(xì)節(jié)# import_config.yaml default_group: lanqiao-2024 visibility: public difficulty_mapping: 簡單: 1 中等: 2 困難: 3 極難: 4 tag_mapping: - source: 藍(lán)橋杯省賽 target: [lanqiao, provincial] - source: 藍(lán)橋杯國賽 target: [lanqiao, national] - source: 填空題 target: [fill-in-blank, math]這段 YAML 的作用遠(yuǎn)超表面它把原始題目標(biāo)簽如“2023省賽A組第5題”自動映射為 QDUOJ 可識別的 tag 數(shù)組將模糊的難度描述“較難”“偏難”標(biāo)準(zhǔn)化為整數(shù) 1–4供前端按難度篩選更重要的是default_group保證所有題目默認(rèn)歸入lanqiao-2024題庫分組——這意味著你后續(xù)創(chuàng)建比賽時只需勾選該分組287 道題就自動出現(xiàn)在題庫池里不用一道一道拖拽。2.2 中間層problems/目錄下的題目原子單元每個題目以獨(dú)立子目錄存在命名規(guī)則為P{四位編號}-{題目標(biāo)識}例如P0127-2023-provincial-A-5。這種命名不是為了好看而是為自動化腳本提供穩(wěn)定解析依據(jù)。每個子目錄內(nèi)必須包含以下 5 類文件文件名類型說明problem.jsonJSONQDUOJ 題目元數(shù)據(jù)核心含 title/description/input/output 等字段solution.cpp文本官方或社區(qū)驗(yàn)證通過的 C 參考解非必需但本包全部提供test_cases/目錄至少含1.in/1.out最多支持 20 組測試點(diǎn)文件名嚴(yán)格為{n}.in/{n}.outattachments/目錄存放題干中引用的圖片、數(shù)據(jù)文件如map.png,data.txtmetadata.yamlYAML本包特有記錄該題在藍(lán)橋杯官網(wǎng)的原始 URL、知識點(diǎn)標(biāo)簽DFS/BFS/DP、是否為填空題等其中problem.json是最關(guān)鍵的契約文件。我們以P0042-2021-national-A-12021國賽A組填空題卡片為例看其關(guān)鍵字段如何規(guī)避常見翻車點(diǎn){ title: 卡片數(shù)字 0~9 各 2021 張拼最大數(shù), description: 小藍(lán)有 0~9 的卡片各 2021 張……此處為精簡后的 Markdown 格式題干, input: 無輸入, output: 輸出一個整數(shù)表示能拼出的最大數(shù)。, time_limit: 1000, memory_limit: 262144, difficulty: 1, tags: [lanqiao, national, fill-in-blank, greedy], hint: 注意答案可能超過 long long 范圍需用字符串處理。, sample_input: , sample_output: 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999......, sample_output: 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999............, spj: false, io_mode: standard }這段 JSON 的設(shè)計(jì)有三處關(guān)鍵細(xì)節(jié)input和output字段明確寫為無輸入和輸出一個整數(shù)……而非留空或?qū)憽耙姌永薄DUOJ 前端渲染題面時若這兩個字段為空會顯示默認(rèn)占位符影響學(xué)生理解sample_input和sample_output雖然內(nèi)容極長因答案是超長數(shù)字串但嚴(yán)格控制在 65535 字節(jié)以內(nèi)——這是 QDUOJ 數(shù)據(jù)庫TEXT字段的默認(rèn)長度上限超長會導(dǎo)致導(dǎo)入失敗spj設(shè)為falseio_mode設(shè)為standard表明該題使用標(biāo)準(zhǔn)輸入輸出判題不啟用 Special Judge。這對填空題至關(guān)重要藍(lán)橋杯填空題只需輸出唯一答案無需處理多解、浮點(diǎn)誤差等復(fù)雜邏輯強(qiáng)行開 SPJ 反而增加判題機(jī)負(fù)擔(dān)。2.3 底層契約test_cases/目錄的物理結(jié)構(gòu)即判題協(xié)議QDUOJ 判題機(jī)讀取測試用例的方式非常機(jī)械它按文件名數(shù)字順序讀取1.in→1.out→2.in→2.out…… 并逐組比對。因此本包對test_cases/目錄做了三項(xiàng)硬性約束所有.in文件必須是純文本無 BOM行尾為\nWindows 風(fēng)格\r\n會導(dǎo)致 Cgetline()多讀一個字符所有.out文件末尾必須帶換行符否則判題機(jī)會認(rèn)為輸出缺失最后一行測試點(diǎn)編號從1開始連續(xù)不可跳號如1.in,2.in,4.in會導(dǎo)致第 3 組被跳過。我們以P0089-2022-provincial-B-32022省賽B組編程題修剪灌木為例其test_cases/目錄結(jié)構(gòu)如下test_cases/ ├── 1.in # 輸入4 ├── 1.out # 輸出0\n3\n0\n3\n注意末尾 \n ├── 2.in # 輸入5 ├── 2.out # 輸出0\n4\n0\n4\n0\n └── 3.in # 輸入1 └── 3.out # 輸出0\n注意3.out文件內(nèi)容是0\n兩個字節(jié)不是0一個字節(jié)。這個細(xì)節(jié)在本地測試時容易忽略但一旦部署到生產(chǎn)環(huán)境就會出現(xiàn)“本地跑過、線上 WA”的玄學(xué)問題。本包所有.out文件均通過unix2dos -n工具批量校驗(yàn)并修復(fù)。3. 運(yùn)行與導(dǎo)入從解壓到題目出現(xiàn)在 OJ 后臺的完整實(shí)操鏈拿到壓縮包后最急迫的問題永遠(yuǎn)是“怎么讓它動起來”這里不講虛的只列真實(shí)環(huán)境中驗(yàn)證過的每一步命令、每個參數(shù)含義、每個可能卡住的環(huán)節(jié)。整個流程分為三階段環(huán)境準(zhǔn)備 → 數(shù)據(jù)校驗(yàn) → 正式導(dǎo)入。3.1 環(huán)境準(zhǔn)備確認(rèn)你的 QDUOJ 版本與依賴本包適配 QDUOJ v3.0.0 及以上版本。請先確認(rèn)你的部署環(huán)境# 進(jìn)入 QDUOJ 項(xiàng)目根目錄通常含 manage.py cd /path/to/qduoj # 檢查 Django 版本v3.0 要求 Django 3.2 python -m django --version # 輸出應(yīng)為3.2.x 或 4.0.x # 檢查數(shù)據(jù)庫遷移狀態(tài)必須無未應(yīng)用遷移 python manage.py showmigrations # 輸出中所有 migration 前應(yīng)有 [X]無 [ ]未應(yīng)用 # 檢查核心模型是否就緒關(guān)鍵 python manage.py shell -c from problem.models import Problem; print(Problem.objects.count()) # 輸出應(yīng)為一個數(shù)字如 0 或已有題目數(shù)而非報(bào)錯如果最后一條命令報(bào)ModuleNotFoundError: No module named problem說明你的 QDUOJ 安裝不完整缺少problemapp。此時需回退到 QDUOJ 官方倉庫執(zhí)行g(shù)it checkout v3.2.0 # 切到穩(wěn)定版 pip install -e . # 重新安裝為可編輯模式提示不要試圖用 pip install qduoj 直接安裝——PyPI 上的包早已停止更新缺少本包所需的import_problemsmanagement command。3.2 數(shù)據(jù)校驗(yàn)用內(nèi)置腳本預(yù)檢題庫包完整性本包附帶一個輕量級校驗(yàn)工具validate_problems.py它不依賴 QDUOJ 環(huán)境純 Python 實(shí)現(xiàn)用于在導(dǎo)入前發(fā)現(xiàn) 90% 的結(jié)構(gòu)性錯誤# 在題庫包根目錄下運(yùn)行即包含 manifest.json 的目錄 python validate_problems.py # 正常輸出示例 # ? Validated 287 problems # ? All problem.json files parse as valid JSON # ? All test_cases/ directories contain matching .in/.out pairs # ? No duplicate problem IDs found # ? All sample_output lengths 65535 bytes # Warning: P0211-2023-national-A-2 has no solution.cpp (expected for fill-in-blank) # ?? Validation passed. Ready for import.這個腳本會檢查 7 類常見問題JSON 語法、測試點(diǎn)配對、ID 唯一性、樣例長度、附件路徑存在性、難度值范圍1–4、標(biāo)簽合法性。其中 Warning行是善意提示不影響導(dǎo)入只有? Error行出現(xiàn)才需人工干預(yù)。3.3 正式導(dǎo)入一條命令 兩個關(guān)鍵參數(shù)一切就緒后執(zhí)行導(dǎo)入命令# 在 QDUOJ 項(xiàng)目根目錄下執(zhí)行 python manage.py import_problems \ --path /path/to/lanqiao-qduoj-modified/problems/ \ --group lanqiao-2024 \ --skip-duplicate參數(shù)詳解--path指向題庫包內(nèi)的problems/目錄注意不是包根目錄--group指定題目歸屬分組必須與manifest.json中的default_group一致否則部分題目可能被分配到默認(rèn)分組public--skip-duplicate遇到同 ID 題目時跳過而非報(bào)錯。這是安全閥——如果你之前已導(dǎo)入過部分題目此參數(shù)可避免中斷。導(dǎo)入過程約耗時 3–8 分鐘取決于服務(wù)器磁盤 I/O終端會實(shí)時打印進(jìn)度Importing problem P0001-2013-provincial-A-1... OK Importing problem P0002-2013-provincial-A-2... OK ... Imported 287 problems successfully.導(dǎo)入完成后立即驗(yàn)證# 查看新題庫分組下的題目數(shù) python manage.py shell -c from problem.models import Problem print(Problem.objects.filter(group__namelanqiao-2024).count()) # 輸出應(yīng)為 287注意導(dǎo)入成功 ≠ 題目可判。還需登錄 QDUOJ 后臺/admin/進(jìn)入Problem模型隨機(jī)打開 2–3 道題點(diǎn)擊「Preview」按鈕確認(rèn)題干渲染正常、樣例可復(fù)制、附件圖片能加載。這是最后一道肉眼防線。4. 避坑指南那些讓你在凌晨兩點(diǎn)對著日志抓狂的典型問題即使嚴(yán)格按照上述步驟操作仍可能在某個環(huán)節(jié)突然卡住。以下是我在 5 所高校部署過程中記錄的真實(shí)翻車現(xiàn)場。每一條都對應(yīng)一個具體現(xiàn)象、根本原因和可立即執(zhí)行的解決方案不講原理只給藥方。4.1 現(xiàn)象import_problems命令報(bào)錯KeyError: title且定位到某道題的problem.json原因該題problem.json中title字段缺失或值為空字符串title: 。QDUOJ 模型定義中title是非空字段blankFalseDjango ORM 插入時直接拋異常。解決用以下命令快速定位并修復(fù)# 查找所有 title 為空的 JSON 文件 grep -r title: * /path/to/problems/ | cut -d: -f1 # 編輯對應(yīng)文件將 改為有意義的標(biāo)題如 P0127-2023省賽A組第5題4.2 現(xiàn)象導(dǎo)入完成但后臺查看題目時題干顯示為亂碼中文變問號或方塊原因problem.json文件本身編碼不是 UTF-8常見于 Windows 記事本另存為時選了 ANSI 或 GBK。解決批量轉(zhuǎn)碼Linux/macOS# 進(jìn)入 problems/ 目錄 cd /path/to/problems/ # 將所有 problem.json 轉(zhuǎn)為 UTF-8無 BOM find . -name problem.json -exec iconv -f GBK -t UTF-8 {} -o {}.utf8 \; find . -name problem.json.utf8 -exec mv {} ../temp/ \; # 手動檢查 1–2 個文件確認(rèn)無誤后再批量覆蓋4.3 現(xiàn)象題目顯示正常但提交 C 代碼后始終返回Runtime Error日志顯示terminate called after throwing an instance of std::ios_base::failure原因該題測試點(diǎn).in文件末尾無換行符導(dǎo)致 C 代碼中cin n讀取后cin狀態(tài)異常后續(xù)getline()失敗。解決用file命令檢查file P0042-2021-national-A-1/test_cases/1.in # 若輸出含 with CR line terminators說明是 Windows 風(fēng)格 # 用 dos2unix 修復(fù) dos2unix P0042-2021-national-A-1/test_cases/*.in4.4 現(xiàn)象導(dǎo)入后部分題目在比賽列表中不可見Problem.objects.filter(...).count()返回值小于 287原因import_config.yaml中default_group: lanqiao-2024對應(yīng)的 Group 在數(shù)據(jù)庫中不存在。QDUOJ 不會自動創(chuàng)建分組而是靜默跳過該題。解決手動創(chuàng)建分組python manage.py shell -c from contest.models import Group Group.objects.get_or_create(namelanqiao-2024, defaults{description: 藍(lán)橋杯2024真題庫}) 4.5 現(xiàn)象所有題目導(dǎo)入成功但填空題提交后始終顯示W(wǎng)rong Answer即使輸出與sample_output完全一致原因填空題的problem.json中spj字段被誤設(shè)為true而實(shí)際未提供spj_code.py。QDUOJ 判題機(jī)找不到 SPJ 腳本返回默認(rèn) WA。解決全局修正# 將所有 problem.json 中的 spj: true 替換為 spj: false grep -rl spj: *true /path/to/problems/ | xargs sed -i s/spj: *true/spj: false/g # 再次運(yùn)行 import_problems加 --skip-duplicate 參數(shù)5. 二次開發(fā)如何安全地為題庫添加新題、修改舊題、對接自定義判題邏輯當(dāng)你把這 287 道題穩(wěn)穩(wěn)跑在自己服務(wù)器上后下一步往往是定制化比如加入本校 ACM 校賽題、把某道題的測試點(diǎn)加強(qiáng)、或者為一道交互題寫專用 SPJ。這些操作看似簡單但極易破壞題庫一致性。下面是我總結(jié)的三條鐵律和一個可復(fù)用的自動化模板。5.1 新增題目必須走generate_problem.py模板生成骨架手寫problem.json是災(zāi)難源頭。本包提供scripts/generate_problem.py它根據(jù)最小輸入生成合規(guī)骨架# 用法python generate_problem.py 題目標(biāo)識 題目標(biāo)題 python scripts/generate_problem.py P9999-2024-school-contest-1 校賽熱身斐波那契模運(yùn)算 # 輸出 # Created problem directory: problems/P9999-2024-school-contest-1/ # ├── problem.json # 已填充 title/description 等基礎(chǔ)字段 # ├── test_cases/ # 創(chuàng)建了 1.in/1.out 占位文件 # ├── attachments/ # 空目錄 # └── metadata.yaml # 已寫入 source: school-contest這個腳本的核心價(jià)值在于它生成的problem.json中time_limit和memory_limit默認(rèn)設(shè)為1000和2621441s/256MB符合藍(lán)橋杯常規(guī)限制difficulty設(shè)為2中等避免新手誤設(shè)為1導(dǎo)致題目過水更重要的是它自動在metadata.yaml中寫入generated_by: generate_problem.py方便后期審計(jì)哪些題是人工創(chuàng)建、哪些是原始包自帶。5.2 修改舊題用diff_and_patch.py做增量更新拒絕全量覆蓋直接編輯problem.json風(fēng)險(xiǎn)極高——你可能改了title卻忘了同步更新metadata.yaml中的source字段導(dǎo)致后臺標(biāo)簽混亂。正確做法是用補(bǔ)丁機(jī)制# 步驟1導(dǎo)出當(dāng)前題目為 patch 模板 python scripts/export_patch.py P0042-2021-national-A-1 patches/P0042.patch # 步驟2編輯 P0042.patch只改你需要的字段如增加 hint # --- original # modified # -5,0 6 # hint: 注意答案可能超過 long long 范圍需用字符串處理。, # 步驟3應(yīng)用補(bǔ)丁自動校驗(yàn)字段合法性 python scripts/apply_patch.py patches/P0042.patchapply_patch.py會做三件事解析 patch 內(nèi)容、檢查修改字段是否在白名單內(nèi)如只允許改hint/time_limit/tags、執(zhí)行 JSON Merge非覆蓋式。這樣即使你誤刪了description字段腳本也會報(bào)錯并中止而不是默默生成一個殘缺題目。5.3 對接自定義 SPJ用spj_template.py保證接口契約為編程題寫 SPJ 是高頻需求但很多人直接扔一個spj.py進(jìn)去就完事結(jié)果判題機(jī)調(diào)用時報(bào)SPJ not found。根本原因是 QDUOJ 要求 SPJ 必須實(shí)現(xiàn)特定函數(shù)簽名。本包提供標(biāo)準(zhǔn)化模板# spj_template.py def compare(user_output: str, expected_output: str, input_data: str) - int: SPJ 入口函數(shù)必須返回 0 - AC完全匹配 1 - WA答案錯誤 2 - PE格式錯誤如多余空格 3 - RE運(yùn)行時錯誤如 SPJ 自身崩潰 # 示例忽略輸出末尾空白的比較 if user_output.rstrip() expected_output.rstrip(): return 0 else: return 1 # 以下為 QDUOJ 調(diào)用時注入的全局變量勿刪 user_output expected_output input_data if __name__ __main__: # 僅用于本地測試 import sys if len(sys.argv) 4: user_output, expected_output, input_data sys.argv[1:] print(compare(user_output, expected_output, input_data))將此模板保存為P0123-xxx/spj.py并在對應(yīng)problem.json中設(shè)spj: true即可生效。它的價(jià)值在于函數(shù)簽名與 QDUOJ 判題機(jī)完全一致注釋明確告知返回值含義if __name__ __main__塊支持命令行測試避免上線后才發(fā)現(xiàn)邏輯錯誤。從那以后我每次為題庫新增題目都強(qiáng)制走generate_problem.py每次修改舊題必先export_patch.py備份每次寫 SPJ第一行就是粘貼這個模板。不是信不過自己而是信不過人類在凌晨三點(diǎn)的判斷力——這套流程就是我的后悔藥。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取