華為OD機試_2025 B卷_靜態掃描(Python,100分)(附詳細解題思路)

題目描述

靜態掃描可以快速識別源代碼的缺陷,靜態掃描的結果以掃描報告作為輸出:

1、文件掃描的成本和文件大小相關,如果文件大小為N,則掃描成本為N個金幣

2、掃描報告的緩存成本和文件大小無關,每緩存一個報告需要M個金幣

3、掃描報告緩存后,后繼再碰到該文件則不需要掃描成本,直接獲取緩存結果

給出源代碼文件標識序列和文件大小序列,求解采用合理的緩存策略,最少需要的金幣數。

輸入描述
第一行為緩存一個報告金幣數M,L<= M <= 100

第二行為文件標識序列:F1,F2,F3,…,Fn。

第三行為文件大小序列:S1,S2,S3,…,Sn。

備注:

1 <= N <= 10000
1 <= Fi <= 1000
1 <= Si <= 10

輸出描述
采用合理的緩存策略,需要的最少金幣數

用例

輸入5
1 2 2 1 2 3 4
1 1 1 1 1 1 1
輸出7
說明文件大小相同,掃描成本均為1個金幣。緩存任意文件均不合算,因而最少成本為7金幣。
輸入5
2 2 2 2 2 5 2 2 2
3 3 3 3 3 1 3 3 3
輸出9
說明

靜態掃描成本優化:緩存策略的貪心解法

核心解題思路

題目要求通過合理的緩存策略最小化靜態掃描的總成本,核心問題是:對于重復出現的文件,何時緩存報告最劃算? 關鍵在于權衡掃描成本與緩存成本:

  • 掃描成本:每次掃描文件需支付其大小的金幣(文件越大成本越高)
  • 緩存成本:緩存報告需固定支付M金幣(后續相同文件可免掃描)
  • 決策關鍵:對每個文件標識,判斷"緩存并復用"還是"每次重新掃描"更經濟

貪心策略

對每個文件標識獨立決策:

  • 若不緩存:總成本 = 文件大小 × 出現次數
  • 若緩存:總成本 = 第一次掃描成本 + 緩存成本
  • 選擇成本更低的方案min(文件大小×頻次, 文件大小 + M)

為什么貪心有效?每個文件的緩存決策相互獨立,緩存一個文件不會影響其他文件的掃描成本。

解題步驟詳解

1. 輸入處理與參數設置

# 讀取緩存成本M
M = int(input().strip())# 讀取文件標識序列
file_ids = list(map(int, input().split()))# 讀取文件大小序列
file_sizes = list(map(int, input().split()))

2. 構建文件分組統計

from collections import defaultdict# 創建分組字典:記錄每個標識的[頻次, 總大小, 首次大小]
file_groups = defaultdict(lambda: [0, 0, None])# 遍歷所有文件
for fid, size in zip(file_ids, file_sizes):# 更新出現頻次file_groups[fid][0] += 1# 累加總大小(用于不緩存方案)file_groups[fid][1] += size# 記錄首次出現的大小(用于緩存方案)if file_groups[fid][2] is None:file_groups[fid][2] = size

3. 計算最小成本

total_cost = 0
for fid, (count, total_size, first_size) in file_groups.items():# 不緩存方案:每次掃描cost_no_cache = total_size# 緩存方案:首次掃描+緩存cost_cache = first_size + M# 選擇更經濟的方案total_cost += min(cost_no_cache, cost_cache)

4. 輸出結果

print(total_cost)

關鍵邏輯解析

1. 分組統計的重要性

  • 頻次(count):決定重復掃描的成本
  • 總大小(total_size):計算不緩存方案的總成本
  • 首次大小(first_size):緩存方案只需首次掃描成本

為何記錄首次大小而非任意大小?
緩存發生在首次掃描時,后續文件無論大小如何都復用結果

2. 成本比較的數學原理

決策依據的數學表達式:
min( Σs? , s? + M )
其中:

  • Σs?:所有出現位置的大小之和
  • s?:首次出現的大小
  • M:固定緩存成本

3. 獨立決策的正確性

  • 文件標識相互獨立,緩存決策無耦合
  • 緩存文件A不影響文件B的掃描
  • 局部最優解之和等于全局最優解

完整代碼實現

from collections import defaultdictdef main():# 讀取緩存成本M = int(input().strip())# 讀取文件標識序列file_ids = list(map(int, input().split()))# 讀取文件大小序列file_sizes = list(map(int, input().split()))# 創建分組統計字典# 格式: {文件標識: [出現次數, 總大小, 首次大小]}file_groups = defaultdict(lambda: [0, 0, None])# 遍歷所有文件for fid, size in zip(file_ids, file_sizes):# 更新出現次數file_groups[fid][0] += 1# 累加總大小file_groups[fid][1] += size# 記錄首次大小if file_groups[fid][2] is None:file_groups[fid][2] = size# 計算最小總成本total_cost = 0for fid, (count, total_size, first_size) in file_groups.items():# 計算兩種方案成本cost_no_cache = total_sizecost_cache = first_size + M# 選擇更經濟的方案total_cost += min(cost_no_cache, cost_cache)print(total_cost)if __name__ == "__main__":main()

復雜度分析

  • 時間復雜度:O(N)
    • 遍歷文件序列:O(N)
    • 分組統計:O(N)
    • 決策計算:O(K)(K為唯一文件數,K ≤ N)
  • 空間復雜度:O(K)
    • 存儲分組信息:O(K)(K為唯一文件標識數)

示例驗證

示例1:

輸入:

5
1 2 2 1 2 3 4
1 1 1 1 1 1 1

處理流程:

  1. 分組統計:
    • 文件1: [頻次=2, 總大小=2, 首次大小=1]
    • 文件2: [頻次=3, 總大小=3, 首次大小=1]
    • 文件3: [頻次=1, 總大小=1, 首次大小=1]
    • 文件4: [頻次=1, 總大小=1, 首次大小=1]
  2. 成本決策:
    • 文件1: min(2, 1+5)=2
    • 文件2: min(3, 1+5)=3
    • 文件3: min(1, 1+5)=1
    • 文件4: min(1, 1+5)=1
  3. 總成本:2+3+1+1=7
    輸出:7

示例2:

輸入:

5
2 2 2 2 2 5 2 2 2
3 3 3 3 3 1 3 3 3

處理流程:

  1. 分組統計:
    • 文件2: [頻次=8, 總大小=24, 首次大小=3]
    • 文件5: [頻次=1, 總大小=1, 首次大小=1]
  2. 成本決策:
    • 文件2: min(24, 3+5)=8
    • 文件5: min(1, 1+5)=1
  3. 總成本:8+1=9
    輸出:9

總結

通過貪心策略解決靜態掃描成本優化問題:

  1. 問題特性:重復文件可復用緩存,決策相互獨立
  2. 核心洞察:緩存的價值 = 后續掃描成本節省 - 緩存成本
  3. 算法選擇:分組統計 + 成本比較(O(N)時間復雜度)
  4. 優化關鍵
    • 小文件高頻:傾向不緩存(如示例1)
    • 大文件高頻:傾向緩存(如示例2)
    • 低頻文件:通常不緩存

實際應用場景:編譯器構建系統(如Makefile)、CI/CD流水線,通過緩存中間結果加速重復構建過程。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83067.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83067.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java】在 Spring Boot 中連接 MySQL 數據庫

在 Spring Boot 中連接 MySQL 數據庫是一個常見的任務。Spring Boot 提供了自動配置功能&#xff0c;使得連接 MySQL 數據庫變得非常簡單。以下是詳細的步驟&#xff1a; 一、添加依賴 首先&#xff0c;確保你的pom.xml文件中包含了 Spring Boot 的 Starter Data JPA 和 MySQ…

基于51單片機的音樂盒鍵盤演奏proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1tZCAxQQ7cvyzBfztQpk0UA 提取碼&#xff1a;1234 仿真圖&#xff1a; 芯片/模塊的特點&#xff1a; AT89C52/AT89C51簡介&#xff1a; AT89C51 是一款常用的 8 位單片機&#xff0c;由 Atmel 公司&#xff08;現已被 Microchip 收…

Android Native 之 adbd進程分析

目錄 1、adbd守護進程 2、adbd權限降級 3、adbd命令解析 1&#xff09;adb shell 2&#xff09;adb root 3&#xff09;adb reboot 4、案例 1&#xff09;案例之實現不需要執行adb root命令自動具有root權限 2&#xff09;案例之實現不需要RSA認證直接能夠使用adb she…

C語言進階--動態內存管理

學習數據結構重要的三個部分&#xff1a;指針、結構體、動態內存管理&#xff08;malloc、calloc、realloc、free&#xff09;。 1.為什么存在動態內存分配&#xff1f; 1.空間開辟大小是固定的&#xff1b; 2.數組在聲明時&#xff0c;必須指定數組的長度&#xff0c;它所需…

C# 密封類和密封方法

密封(sealed)是C#中用于限制繼承和多態行為的關鍵字&#xff0c;它可以應用于類和方法&#xff0c;提供了一種控制繼承層次的方式。 密封類 特點 使用 sealed 關鍵字修飾的類密封類不能被其他類繼承&#xff0c;但可以繼承其他類或接口主要用于防止派生所有結構(struct)都是…

thinkpad T-440p 2025.05.31

thinkpad T-440p 2025.05.31 老了退休了&#xff0c;說起來真的可惡現在筆記本的設計師&#xff0c;只有固態硬盤了

WPS自動換行

換行前 換行后 快捷鍵 第一步&#xff1a;啟用「自動換行」功能 選中目標單元格/區域&#xff1a;點擊需要設置的單元格&#xff08;或拖動選中多個單元格&#xff09;。開啟自動換行&#xff08;3種方式任選&#xff09;&#xff1a; 快捷按鈕&#xff1a;在頂部菜單欄點擊「…

cuda_fp8.h錯誤

現象&#xff1a; cuda_fp8.h錯誤 原因&#xff1a; CUDA Toolkit 小于11.8,會報fp8錯誤&#xff0c;因此是cuda工具版本太低。通過nvcc --version查看 CUDA Toolkit 是 NVIDIA 提供的一套 用于開發、優化和運行基于 CUDA 的 GPU 加速應用程序的工具集合。它的核心作用是讓開發…

【TTS】基于GRPO的流匹配文本到語音改進:F5R-TTS

論文地址&#xff1a;https://arxiv.org/abs/2504.02407v3 摘要 我們提出了F5R-TTS&#xff0c;這是一種新穎的文本到語音(TTS)系統&#xff0c;它將群體相對策略優化(GRPO)集成到基于流匹配的架構中。 通過將流匹配TTS的確定性輸出重新表述為概率高斯分布&#xff0c;我們的方…

頭歌java課程實驗(Java面向對象 - 包裝類)

第1關&#xff1a;基本數據類型和包裝類之間的轉換 任務描述 本關任務&#xff1a;實現基本數據類型與包裝類之間的互相轉換。 相關知識 為了完成本關任務&#xff0c;你需要掌握&#xff1a; 1.什么是包裝類&#xff1b; 2.怎么使用包裝類。 什么是包裝類 在JAVA中&#x…

實現一個免費可用的文生圖的MCP Server

概述 文生圖模型為使用 Cloudflare Worker AI 部署 Flux 模型&#xff0c;是參照視頻https://www.bilibili.com/video/BV1UbkcYcE24/?spm_id_from333.337.search-card.all.click&vd_source9ca2da6b1848bc903db417c336f9cb6b的復現Cursor MCP Server實現是參照文章https:/…

ES6 深克隆與淺克隆詳解:原理、實現與應用場景

ES6 深克隆與淺克隆詳解&#xff1a;原理、實現與應用場景 一、克隆的本質與必要性 在 JavaScript 中&#xff0c;數據分為兩大類型&#xff1a; 基本類型&#xff1a;Number、String、Boolean、null、undefined、Symbol、BigInt引用類型&#xff1a;Object、Array、Functio…

新聞數據加載(鴻蒙App開發實戰)

本案例基于ArkTS的聲明式開發范式&#xff0c;介紹了數據請求和onTouch事件的使用。包含以下功能&#xff1a; 數據請求。列表下拉刷新。列表上拉加載。 網絡數據請求需要權限&#xff1a;ohos.permission.INTERNET 一、案例效果截圖 操作說明&#xff1a; 點擊應用進入主頁…

辦公效率王Word批量轉PDF 50 +文檔一鍵轉換保留原格式零錯亂

各位辦公小能手們&#xff0c;我跟你們說啊&#xff01;在辦公的時候&#xff0c;咱經常會碰到要把一堆Word文檔轉成PDF格式的情況&#xff0c;比如說要統一文件格式、保護文檔內容或者方便分享啥的。這時候&#xff0c;就需要用到Word批量轉換成PDF的軟件啦。下面我就給你們好…

一張Billing項目的流程圖

流程圖 工作記錄 2016-11-11 序號 工作 相關人員 1 修改Payment Posted的導出。 Claim List的頁面加了導出。 Historical Job 加了Applied的顯示和詳細。 郝 識別引擎監控 Ps (iCDA LOG :剔除了160篇ASG_BLANK之后的結果): LOG_File 20161110.txt BLANK_CDA/ALL 45/10…

SpringAI系列4: Tool Calling 工具調用 【感覺這版本有bug】

前言&#xff1a;在最近發布的 Spring AI 1.0.0.M6 版本中&#xff0c;其中一個重大變化是 Function Calling 被廢棄&#xff0c;被 Tool Calling 取代。Tool Calling工具調用&#xff08;也稱為函數調用&#xff09;是AI應用中的常見模式&#xff0c;允許模型通過一組API或工具…

第六十三節:深度學習-模型推理與后處理

深度學習模型訓練完成后,如何高效地將其部署到實際應用中并進行準確預測?這正是模型推理與后處理的核心任務。OpenCV 的 dnn 模塊為此提供了強大支持,本文將深入探討 OpenCV 在深度學習模型推理與后處理中的關鍵技術與實踐。 第一部分:基礎概念與環境搭建 1.1 核心概念解析…

uniapp開發企業微信小程序時 wx.qy.login 在uniapp中使用的時候,需要導包嗎?

在 UniApp 中使用 “wx.qy.login” 不需要手動導包&#xff0c;但需要滿足以下條件&#xff1a; 一、環境要求與配置 1&#xfffd; 企業微信環境判斷 必須確保當前運行環境是企業微信客戶端&#xff0c;通過 “uni.getSystemInfoSync().environment” 判斷是否為 “wxwork”…

ONLYOFFICE文檔API:更強的安全功能

在數字化辦公時代&#xff0c;文檔的安全性與隱私保護已成為企業和個人用戶的核心關切。如何確保信息在存儲、傳輸及協作過程中的安全&#xff0c;是開發者與IT管理者亟需解決的問題。ONLYOFFICE作為一款功能強大的開源辦公套件&#xff0c;不僅提供了高效的文檔編輯與協作體驗…

Linux系統編程之共享內存

概述 在Linux系統中&#xff0c;共享內存也是一種高效的進程間通信機制&#xff0c;允許兩個或多個進程共享同一塊物理內存區域。通過這種方式&#xff0c;不同進程可以直接訪問和操作相同的數據&#xff0c;從而避免了數據的復制。由于數據直接在內存中共享&#xff0c;沒有額…