2025藍橋杯python A組題解

真捐款去了,好長時間沒練了,感覺腦子和手都不轉悠了。 B F BF BF 賽時都寫假了, G G G 也只寫了爆搜。

題解其實隊友都寫好了,我就粘一下自己的代碼,稍微提點個人的理解水一篇題解

隊友題解


B

思路:

我是直接枚舉八個段是否填 0 0 0,確定哪些段填 0 0 0 后,縮寫形式也就唯一確定了。接下來我們只需要確定填非 0 0 0 的段的長度和可能數。

確定填 0 0 0 段和冒號的長度重點在于確定縮寫的位置,無外乎三種情況:

  1. 開頭或結尾的連續 0 0 0 段縮寫
  2. 中間的連續 0 0 0 段縮寫
  3. 不縮寫(其實只要縮寫就一定不差于不縮寫)

假設總共有 n n n 段(其實就是 8 8 8),總共有 n u m 0 num0 num0 0 0 0,開頭或結尾的最長連續 0 0 0 段長度為 a n s 1 ans1 ans1,中間的最長連續 0 0 0 段長度為 a n s 2 ans2 ans2,那么三種情況的答案分別是:

  1. 除縮寫部分的剩余部分長度為 n ? a n s 1 n-ans1 n?ans1,需要 n ? a n s 1 ? 1 n-ans1-1 n?ans1?1 個冒號分割。縮寫需要 2 2 2 個冒號。剩余未被縮寫的 0 0 0 的個數為 n u m 0 ? a n s 1 num0-ans1 num0?ans1,因此總長度為 ( n ? a n s 1 ? 1 ) + 2 + ( n u m 0 ? a n s 1 ) (n-ans1-1)+2+(num0-ans1) (n?ans1?1)+2+(num0?ans1)
  2. 除縮寫部分的剩余部分總長度為 n ? a n s 2 n-ans2 n?ans2,需要 n ? a n s 2 ? 2 n-ans2-2 n?ans2?2 個冒號分割(因為是左右兩個部分)。縮寫需要 2 2 2 個冒號。剩余未被縮寫的 0 0 0 的個數為 n u m 0 ? a n s 2 num0-ans2 num0?ans2,因此總長度為 ( n ? a n s 2 ? 2 ) + 2 + ( n u m 0 ? a n s 2 ) (n-ans2-2)+2+(num0-ans2) (n?ans2?2)+2+(num0?ans2)
  3. n ? 1 + n u m 0 n-1+num0 n?1+num0

非零段長度變化時,以外的部分(填 0 0 0 段和冒號)的長度是不變的,假設這個填 0 0 0 段和冒號總長度是 l e n len len。接下來需要確定非 0 0 0 的段的所有情況的總長度,這個部分我們直接爆搜,假設有 p o s pos pos 個非零段,每個段分別有 1 6 1 ? 1 6 0 = 15 , 1 6 2 ? 1 6 1 = 240 , 1 6 3 ? 1 6 2 = 3840 , 1 6 4 ? 1 6 3 = 61440 16^1-16^0=15, 16^2-16^1=240, 16^3-16^2=3840, 16^4-16^3=61440 161?160=15,162?161=240,163?162=3840,164?163=61440 種情況,長度分別為 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4,這樣爆搜的次數是 4 p o s ≤ 4 8 = 65536 4^{pos}\le 4^8=65536 4pos48=65536 次,可以跑得動。

另外因為全 0 0 0 段的時候比較特殊,所以單獨計數。

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;int get_len(string s){//得到簡化后的冒號和0位置的總長度 int n=s.length();int ans1=0,ans2=0,num0=0;for(int i=0;i<n;i++)if(s[i]=='0')num0++;for(int i=0;i<n;i++)if(s[i]!='0'){ans1=max(ans1,i);break;}for(int i=n-1;i>=0;i--)if(s[i]!='0'){ans1=max(ans1,n-i-1);break;}for(int l=1,r=0;l<n-1;l=r+1){r++;while(s[r]=='0' && r<n-1)r++;ans2=max(ans2,r-l);}
//	cout<<ans1<<" "<<ans2<<" "<<num0<<endl;return min(min(n-ans1-1+2+(num0-ans1),n-ans2-2+2+(num0-ans2)),n-1+num0);
}ll tm[]={15,240,3840,61440};
ll len;//某種選取情況的長度 
vector<ll> take;//某種選取情況 
ll tot;//所有情況的總長度 
void dfs(int pos){if(pos<=0){ll t=1;for(auto x:take)t=t*x%mod;//這種選取情況下的情況數 tot=(tot+t*len%mod)%mod;return;}for(int i=0;i<4;i++){len+=i+1;take.push_back(tm[i]);dfs(pos-1);take.pop_back();len-=i+1;}
}signed main(){ll ans=2; for(int i=1;i<(1<<8);i++){string s;for(int j=0;j<8;j++)s += "01"[(i>>j)&1];len=get_len(s);int num1=0;for(int i=0;i<s.length();i++)if(s[i]=='1')num1++;dfs(num1);ans=(ans+tot)%mod;tot=0;
//		cout<<s<<" "<<get_len(s)<<" "<<num1<<" "<<tot<<endl;
//		cout<<ans<<endl;}cout<<ans;return 0;
} 

C

code:

import sys
input = sys.stdin.readlineh, w = map(int, input().split())
s = "2025" * 1145
for i in range(h):print(s[i:i+w])

D

思路:

p y t h o n python python s o r t sort sort 只能指定按照某個位置的值進行排序,不能對兩個數做操作來確定大小。

為了解決這個問題可以用 functoolscmp_to_key,或者重寫類的 __lt__ 方法。

code:

from functools import cmp_to_keyn = int(input())
s = [bin(x)[2:] for x in range(1, n+1)]def cmp(a: str, b: str)-> int:if a+b < b+a:return -1elif a+b == b+a:return 0else:return 1s.sort(key=cmp_to_key(cmp), reverse=True)
print(int("".join(s), 2))

E

思路:

隊友寫假了,這個水是不能往前面的位置倒的,所以就不能求平均數了。

這個題正解是二分答案,很板。

大體思路就是二分答案,對一個需要驗證的答案,如果一個位置的水量高于答案,就把多余的部分都給后面。如果這個位置水量不夠答案,就說明通過前面的努力是不夠填滿它的,這個答案就不成立。

如果不會寫整數二分,可以在 l , r l,r l,r 范圍縮到足夠小時,對小范圍進行暴力枚舉驗證。

code:

import copy
import sys
input = sys.stdin.readline
n, k = list(map(int, input().split()))
a = list(map(int, input().split()))def check(height):t = copy.deepcopy(a)for i in range(n):if t[i] < height:return Falseif i + k < n:t[i + k] += t[i] - heightreturn Truel, r = 1, 10**20
while l < r:mid = (l + r + 1) // 2if check(mid):l = midelse:r = mid - 1print(l)"""
8 3
5 6 4 8 3 4 1 9"""

F

思路:

賽時寫完發現想假了,不過沒時間了就直接交了。思路和隊友是一樣的,直接看他的講解吧。

這題 n = 1000 n=1000 n=1000 還能暴力啊……

不怎么會寫暴搜,暴力杯吃大虧。

code:

n = int(input())
cnt = [0]*7
for x in input().split():cnt[min(6, x.count("6"))] += 1# n = 1000
# cnt = [200 for _ in range(7)]visit = dict()
ans, cur = 0, 0def dfs(status):# status狀態下的最大值global ans, curif len(tuple(x for x in status if x < 0)) > 0:returnif visit.get(tuple(status)):return visit.get(tuple(status))if sum(status) // 2 + cur <= ans:returnif sum([i*x for i, x in enumerate(status, start=1)]) // 6 + cur <= ans:return# print(status)ans = max(ans, cur)for i in range(1, 6):for j in range(max(6-i, i), 6):status[i - 1] -= 1status[j - 1] -= 1cur += 1dfs(status)cur -= 1status[i - 1] += 1status[j - 1] += 1for i in range(1, 6):for j in range(i, 6):for k in range(max(6-i-j, j), 6):status[i - 1] -= 1status[j - 1] -= 1status[k - 1] -= 1cur += 1dfs(status)cur -= 1status[i - 1] += 1status[j - 1] += 1status[k - 1] += 1visit[tuple(status)] = curdfs(cnt[1:6])print(ans + cnt[6])"""
8
666666 666 666 666 66 6 6 6"""

G

思路:

隊友說是染色,其實就是并查集合并連通塊,并額外處理一個連通塊內所有點的最大高度(因為一個連通塊內是互相可達的)

假設我們處理前面一段高度,得到了若干組,你會發現這些組的值域互不覆蓋,且位置越靠后,值越大。

當我們加入一個更高高度的點時(比前面所有高度都高),因為不能到達前面任何一個點,它就會成為新的組。

當我們加入一個低于前面若干高度的點時,它就會和前面所有存在高于它的點的組進行合并,成為一個組。

發現我們其實只需要知道每個組的最大高度就可以了,所以我們可以用單調棧來維護每個組的最大值,并從頂到底按照從大到小的順序放好。

之后每一行跑一遍,每一列跑一遍就好了。

code:

原代碼的下標映射有些混亂,所以改成了從 ( 0 , 0 ) (0,0) (0,0) ( n ? 1 , m ? 1 ) (n-1,m-1) (n?1,m?1)

n, m = map(int, input().split())mp = [[0] * m for _ in range(n)]
for i in range(n):mp[i][:] = map(int, input().split())f = [0] * (n*m)
maxh = [0] * (n*m)
for i in range(n*m):f[i] = imaxh[i] = mp[i // m][i % m]def to_idx(x, y):return x*m+ydef findf(x):if f[x] == x:return xelse:f[x] = findf(f[x])return f[x]def merge(u, v):fu, fv = findf(u), findf(v)maxh[fu] = max(maxh[fu], maxh[fv])f[fv] = fufor i in range(n):stack = list()  # 高度 并查集位置for j in range(m):idx = to_idx(i, j)maxx = mp[i][j]while stack and stack[-1][0] > mp[i][j]:maxx = max(maxx, stack[-1][0])merge(stack[-1][1], idx)stack.pop()stack.append((maxx, idx))for j in range(m):stack = list()  # 高度 并查集位置for i in range(n):idx = to_idx(i, j)maxx = mp[i][j]while stack and stack[-1][0] > mp[i][j]:maxx = max(maxx, stack[-1][0])merge(stack[-1][1], idx)stack.pop()stack.append((maxx, idx))ans = 0
for i in range(n):for j in range(m):fa = findf(to_idx(i, j))ans += maxh[fa]print("{:.6f}".format(ans/(n*m)))"""
2 2
1 4
4 32 3
2 4 1
4 2 3"""

H

思路:

感覺 H < F < G H < F < G H<F<G,這題是個標準的反悔貪心。

優先隊列還是前一天晚上臨時看的。

感覺沒什么好寫的,就丟個類似的題吧 你是銀狼

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

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

相關文章

免費送源碼:Java+ssm+MySQL 校園二手書銷售平臺設計與實現 計算機畢業設計原創定制

摘 要 信息化社會內需要與之針對性的信息獲取途徑&#xff0c;但是途徑的擴展基本上為人們所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人們經常能夠獲得不同類型信息&#xff0c;這也是技術最為難以攻克的課題。針對校園二手書銷售平臺等問題&#xff0c;對校…

工業科學級天文相機:跨界融合的高精密成像解決方案

隨著國內科技的快速發展&#xff0c;工業相機領域正悄然興起一場"天文級"的技術革命。這類兼具工業設備可靠性與天文觀測精度的特殊相機&#xff0c;正在半導體制造、天文觀測、空間探測等領域開辟新的應用疆域。其核心技術突破不僅體現在傳感器性能的提升&#xff0…

論文閱讀筆記——Multi-Token Attention

MTA 論文 在 Transformer 中計算注意力權重時&#xff0c;僅依賴單個 Q 和 K 的相似度&#xff0c;無法有效捕捉多標記組合信息。&#xff08;對于 A、B 兩個詞&#xff0c;單標記注意力需要分別計算兩個詞的注意力分數&#xff0c;再通過后處理定位共同出現的位置或通過多層隱…

301.找出3位偶數

2094. 找出 3 位偶數 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<Integer> resnew ArrayList<>();List<Integer> linew ArrayList<>();public int[] findEvenNumbers(int[] digits) {Arrays.sort(digits);boolean[] numsnew boolea…

【KWDB 創作者計劃】第二卷:開發者實戰篇

?KWDB技術白皮書卷二&#xff1a;開發者實戰篇 ?1. 自然語言到量子查詢的編譯系統 1.1 NL2QSQL翻譯引擎架構 運行時流程圖解&#xff1a; ┌──────────────────────┐ ┌───────────────────┐ ┌─────────────…

前端工程化之新晉打包工具

新晉打包工具 新晉打包工具前端模塊工具的發展歷程分類初版構建工具grunt使用場景 gulp采用管道機制任務化配置與api簡潔 現代打包構建工具基石--webpack基于webpack改進的構建工具rollup 推薦舉例說明package.jsonrollup.config.mjsmy-extract-css-rollup-plugin.mjssrc/index…

ai軟件UI自動化

在AI與UI自動化結合的場景中,通常涉及計算機視覺(CV)、自然語言處理(NLP)和機器學習(ML)等技術。以下是實現AI驅動UI自動化的關鍵方向、工具和步驟: ?一、核心應用場景? ?元素定位增強? ?問題?:傳統工具依賴XPath/CSS選擇器,易因UI變化失效。?AI方案?:CV識別…

關于 C++ 中 cin 對象和 EOF 的詳細解釋

【DeepSeek提問】 給解釋一下下面這段話&#xff08;C編程&#xff09; cin是 iostream 類的一個對象實例&#xff0c;如果輸入正常&#xff0c; cin 將返回本身。 舉個例子&#xff1a;cin>x>>y, 如果 cin>>x 讀入正常&#xff0c;那么將返回cin, 相當于后面繼…

Vue 3 和 Vue 2 的區別及優點

Vue.js 是一個流行的 JavaScript 框架&#xff0c;廣泛用于構建用戶界面和單頁應用。自 Vue 3 發布以來&#xff0c;很多開發者開始探索 Vue 3 相較于 Vue 2 的新特性和優勢。Vue 3 引入了許多改進&#xff0c;優化了性能、增強了功能、提升了開發體驗。本文將詳細介紹 Vue 2 和…

【特權FPGA】之UART串口

0.簡介 通用異步收發器(Universal Asynchronous Receiver&#xff0f;Transmitter&#xff0c;UART)可以和各種標準串行接口&#xff0c;如RS 232和RS 485等進行全雙工異步通信&#xff0c;具有傳輸距離遠、成本低、可靠性高等優點。一般UART由專用芯片如8250&#xff0c;1645…

Vue3中watch監視reactive對象方法詳解

在Vue3中&#xff0c;使用watch監視reactive對象時&#xff0c;需根據監視的目標選擇合適的方法。以下是詳細的步驟和說明&#xff1a; 1. 監視整個reactive對象 自動深度監視&#xff1a;直接監視reactive對象時&#xff0c;Vue3會默認啟用深度監視&#xff0c;無需設置deep:…

如何制定性能調優策略

目錄 性能測試攻略 微基準性能測試 宏基準性能測試 熱身問題 多 JVM 情況下的影響 合理分析結果&#xff0c;制定調優策略 推薦閱讀 性能測試攻略 性能測試是提前發現性能瓶頸&#xff0c;保障系統性能穩定的必要措施。下面我先給你介紹兩種常用 的測試方法&#xff0c;幫…

HarmonyOS-ArkUI V2裝飾器@Local裝飾器:組件內部狀態

@Local裝飾器的作用 @Local裝飾器是用來裝飾組件內的狀態的。而且它修飾的變量可以成為數據源。Local裝飾器,作用跟名字差不多,重點突出了“本地”的特性,也就是使用的范圍僅僅限制在組件內部。且它在初始化的時候必須是在本地進行初始化的,不能在外部組件,同時也禁止了外…

Linux線程屬性與多線程開發:API詳解與實戰代碼解析

Linux 線程的屬性 線程池 多線程的創建 線程的屬性 引入 我們設想一個場景&#xff0c;使用pthread_detach時&#xff0c;發現線程早就已經結束了&#xff0c;這時候pthread_detach還能正常發揮清理線程的 獨有空間 的作用嗎&#xff1f; 答案是可以的&#xff0c;但是這難…

測試第二課-------測試分類

作者前言 &#x1f382; ??????&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ?&#x1f382; 作者介紹&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

MySQL安裝實戰分享

一、在 Windows 上安裝 MySQL 1. 下載 MySQL 安裝包 訪問 MySQL 官方下載頁面。選擇適合你操作系統的版本。一般推薦下載 MySQL Installer。 2. 運行安裝程序 雙擊下載的安裝文件&#xff08;例如 mysql-installer-community-<version>.msi&#xff09;。如果出現安全…

數據庫預熱

介紹 Database Warm-up &#x1f9e0; 一句話理解 數據庫是在應用啟動階段&#xff0c;提前建立數據庫連接 或 執行輕量 SQL 操作&#xff0c;從而 加快首個請求的響應速度 的一種優化手段 &#x1f3af; 為什么需要數據庫預熱&#xff1f; 當 FastAPI 或其他 Web 服務剛啟…

SearXNG

SearXNG 什么是 SearXNG &#xff1f;說白了&#xff0c;其實就是一個免費開源的搜索引擎。那為什么要本地安裝它呢&#xff1f; 看它官網的解釋(翻譯)&#xff0c;當然&#xff0c;其中官方也有一篇文檔解釋了為什么需要部署使用私有示例&#xff1a;為什么使用私有實例&…

js 顏色轉換分析

一、十六進制轉RGB function hexToRgba(hex) {// 移除 # 字符hex hex.replace(#, );// 處理簡寫形式如 #fffif (hex.length 3) {hex hex[0] hex[0] hex[1] hex[1] hex[2] hex[2];}// 轉換為十進制const r parseInt(hex.substring(0, 2), 16); // 截圖前兩位&#xff0…

智能資源管理機制-重傳機制

一、發送端資源管理的核心機制 1. 滑動窗口&#xff08;Sliding Window&#xff09; 這是TCP協議的核心優化設計&#xff1a; 窗口動態滑動&#xff1a;發送端不需要保留所有已發送的分組&#xff0c;只需維護一個"發送窗口"窗口大小&#xff1a;由接收方通告的接…