2025藍橋杯python A組省賽 題解

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

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

隊友題解

2025藍橋杯C++ A組省賽 題解

注:所有代碼均已通過洛谷數據(除了 F F F 題爆搜,有三個點 T L E TLE TLE,這個洛谷時限只有一秒,但是賽時是十秒),但是民間數據較弱,不排除會有 b u g bug bug


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__ 方法。

因為這個答案可能會很大,所以可能需要手動調大 int 的存儲位數。

code:

from functools import cmp_to_key
import syssys.set_int_max_str_digits(1000000)n = 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/web/75922.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75922.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75922.shtml

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

相關文章

測試基礎筆記第四天(html)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 html介紹1. 介紹2.骨架標簽3.常用標簽標題標簽段落標簽超鏈接標簽圖片標簽換行和空格標簽布局標簽input標簽&#xff08;變形金剛&#xff09;form標簽列表標簽 htm…

10 穴 汽車連接器的15個設計特點

汽車行業嚴重依賴卓越的電氣系統來確保功能和可靠性。這些系統的關鍵組件是 10 腔連接器&#xff0c;它為布線和信號傳輸提供解決方案。制造商和工程師必須仔細評估這些連接器的設計特性&#xff0c;以優化性能和安全性。 本博客研究了汽車 10 腔連接器的 15 個設計特征&#…

Summary

一、數據結構 1.1 哈希 主要是HashMap和HashSet&#xff1b;其中HashSet底層是一個HashMap屬性。 // 獲取HashMap元素,HashSet均不支持 map.keySet (); // Set<k> map.values (; // Collection<V> map.entrySet();//Set<Map.Entry<K,V>> for (Map.E…

【Leetcode-Hot100】最小覆蓋子串

題目 解答 想到使用雙指針哈希表來實現&#xff0c;雙指針的left和right控制實現可滿足字符串。 class Solution(object):def minWindow(self, s, t):""":type s: str:type t: str:rtype: str"""len_s, len_t len(s), len(t)hash_map {}for…

Flutter 播放利器:`media_kit` 的詳細介紹與使用指南

在 Flutter 項目中實現音視頻播放&#xff0c;開發者過去主要依賴如 video_player、just_audio 等第三方庫&#xff0c;但這些庫或多或少存在一些局限性&#xff0c;比如平臺兼容性差、定制能力不足、播放格式有限等問題。 而 media_kit 是近年崛起的一款全平臺音視頻播放解決…

4.14【Q】pc homework3

我正在學習并行計算&#xff0c;解決這個問題&#xff1f;詳細解釋&#xff0c;越細節越好 我正在學習并行計算&#xff0c;“首次允許在 taskloop 構造中使用 reduction 子句&#xff0c;并引入了 task_reduction&#xff08;用于 taskgroup 構造&#xff09;和 in_reduction&…

ArrayList vs LinkedList,HashMap vs TreeMap:如何選擇最適合的集合類?

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 在 Java 開發中&#xff0c;集合類的選擇直接影響程序的性能和代碼的可維護性。不同的數據結構適用于不同的場景&#xff0c;盲目使用可能導致內存浪費、性能…

大模型訓練顯存壓縮實戰:ZeRO-3 vs 梯度累積 vs 量化混合策略

一、顯存瓶頸的本質與挑戰 大模型訓練面臨的核心矛盾是模型參數量指數級增長與GPU顯存容量線性提升之間的鴻溝。以175B參數模型為例&#xff0c;其顯存消耗主要來自三個方面&#xff1a; 參數存儲?&#xff1a;FP32精度下需700GB顯存?梯度緩存?&#xff1a;反向傳播產生的…

邊緣計算與隱私計算的融合:構建數據經濟的“隱形護盾“

在數據成為核心生產要素的今天&#xff0c;邊緣計算與隱私計算的交匯正在重塑技術生態。這并非簡單的技術疊加&#xff0c;而是一場關于數據主權、算力分配與信任機制的深度博弈。本文將從"數據流動的拓撲學"視角&#xff0c;探討二者融合如何重構數字社會的基礎設施…

Obsidian 文件夾體系構建 -INKA

Obsidian 文件夾體系構建 -INKA 本篇文章主要分享一下自己折騰學習實踐過的 INKA 框架方法。原地址&#xff1a;Obsidian文件夾體系構建–INKA。 文章目錄 Obsidian 文件夾體系構建 -INKA前言INKA簡介INKA 理論最佳實踐實際應用 反思 前言 上文 Obsidian文件夾體系構建-ACCES…

ocr-不動產權識別

目錄 一、在阿里云申請ocr識別服務 二、創建springboot項目 三、后續 一、在阿里云申請ocr識別服務 在線體驗&#xff1a;房產證圖片上傳 [阿里官方]不動產權證OCR文字識別_API專區_云市場-阿里云 (aliyun.com) 可以選擇一毛500次這個 當然也可以白嫖100 下面有個在線調試…

LeetCode算法題(Go語言實現)_47

題目 給你一個 m x n 的迷宮矩陣 maze &#xff08;下標從 0 開始&#xff09;&#xff0c;矩陣中有空格子&#xff08;用 ‘.’ 表示&#xff09;和墻&#xff08;用 ‘’ 表示&#xff09;。同時給你迷宮的入口 entrance &#xff0c;用 entrance [entrancerow, entrancecol…

The Strict Teacher (Hard Version) 去除無效的干擾!巧妙轉化

文章目錄 The Strict Teacher (Hard Version) 思考問題&#xff01;那么多個人抓一個人&#xff0c;是否是每一個人都是對于最優策略的答案是有貢獻的&#xff1f;答案是否定的&#xff0c;其實問題可以簡化為三種情況&#xff1a; 所有的老師都在大衛的右邊&#xff0c;…

《 Reinforcement Learning for Education: Opportunities and Challenges》全文閱讀

Reinforcement Learning for Education: Opportunities and Challenges 面向教育的強化學習&#xff1a;機遇與挑戰 摘要 本綜述文章源自作者在 Educational Data Mining (EDM) 2021 會議期間組織的 RL4ED 研討會。我們組織了這一研討會&#xff0c;作為一項社區建設工作的組…

idea的快捷鍵使用以及相關設置

文章目錄 快捷鍵常用設置 快捷鍵 快捷鍵作用ctrlshift/注釋選中內容Ctrl /注釋一行/** Enter文檔注釋ALT SHIFT ↑, ALT SHIFT ↓上下移動當前代碼Ctrl ALT L格式化代碼Ctrl X刪除所在行并復制該行Ctrl D復制當前行數據到下一行main/psvm快速生成入口程序soutSystem.o…

代碼隨想錄算法訓練營Day30

力扣452.用最少數量的箭引爆氣球【medium】 力扣435.無重疊區間【medium】 力扣763.劃分字母區間【medium】 力扣56.合并區間【medium】 一、力扣452.用最少數量的箭引爆氣球【medium】 題目鏈接&#xff1a;力扣452.用最少數量的箭引爆氣球 視頻鏈接&#xff1a;代碼隨想錄 題…

Swift —— delegate 設計模式

一、什么是 delegate 模式 所謂 delegate 就是代理模式。簡單來說&#xff0c;delegate 模式就是在類的函數里運行完一段代碼后&#xff0c;你可以通過一個符合某個代理協議的屬性來調代理的方法。其中&#xff0c;代理方法就是回調函數。 二、delegate 模式與閉包比的優勢 …

linux-vi和文件操作

在 Linux 系統的世界里&#xff0c;有一個核心思想貫穿始終&#xff0c;那就是 “萬物都是文件”。這一理念極大地簡化了系統資源的管理和操作&#xff0c;為用戶和開發者提供了統一且高效的交互方式。本文將深入探討這一理念在 Linux 文件系統中的具體體現&#xff0c;從硬盤分…

Endnote 21顯示字段設置與修改詳細解析(附Endnote Click)

目錄 前言字段設置與詳細解釋Endnote Click1. 安裝 Endnote Click2. 一鍵獲取Edge插件3. 安裝完成啟動插件4. 檢索期刊文獻案例5. 在 Endnote Click 我的locker中導入文獻 前言 在學術研究的漫漫征途中&#xff0c;高效管理參考文獻是每位學者、學生都繞不開的關鍵環節。Endno…

java使用 ?Stream 流對自定義對象數組去重的

在 Java 中&#xff0c;使用 Stream 流對自定義對象數組去重的核心是確保對象能正確判斷“重復”的邏輯。以下是具體實現方法及場景分析&#xff1a; 方法 1&#xff1a;直接使用 distinct()&#xff08;需重寫 equals 和 hashCode&#xff09; 若自定義對象已正確重寫 equals…