--- tags: 比賽題解 title: 110 北市賽熱身賽 題解 --- - 比賽連結: https://oj.lscsc.club/contest/1 :::info # A. 病毒傳播 - 題目連結: https://oj.lscsc.club/contest/1/problem/1 ::: :::success ## 子測資一 (如果你會暴搜的話就能解這筆測資ww) - bfs搜索 - 每筆查詢裡面,對於每個帶原者,用bfs花 $O(m)$ 的時間找出與p的距離。距離p最近的,就是答案。 - 複雜度: $O(nmq)$ - floyd-warshall - 三層for迴圈,直接找出所有點之間的距離:) - 複雜度: $O(n^3+q)$ ::: :::success ## 子測資二 我也不知道為啥要有這筆子測資www - dijkstra - 如果有人不會用bfs但是會dijkstra的話,也可以過這筆測資喔XDD ::: :::success ## 子測資三 - 還是bfs搜索 - 預處理:把所有帶原者當作起點,使用bfs找到所有點到最近帶原者的距離。 - 對於查詢,直接輸出答案:) - 複雜度: $O(n+m+q)$ ::: :::info # B. 又被坑了 - 題目連結: https://oj.lscsc.club/contest/1/problem/2 ::: :::success ## 子測資一 - 枚舉+bfs - 如果今天只要你驗證一個有空缺的矩陣是否能被還原... - 驗證的方法,就是用bfs從只有必定能還原的地方出發,看看能不能還原整個矩陣,驗證複雜度 $O(nm)$ - 那我們對於所有空缺,枚舉給高麗菜復原跟不給高麗菜復原兩種可能,所以一共有 $O(2^{nm})$ 種可能,驗證是否能復原以及計算給高麗菜的復原成本:) - 複雜度: $O(nm\times2^{nm})$ ::: :::success ## 子測資二 - 圖+dfs - 嘗試著把矩陣 $A$ 變成一個二分圖:如果 $A[i][j]=-1$,那我們就在圖中把兩個點 $x_i, y_j$ 中間連一條邊,邊權是 $B[i][j]$ - 這樣我們得到一個帶權無向圖,有 $O(n+m)$ 個節點,還有 $O(nm)$ 條邊 - 我們會發現,如果圖上有環,就沒辦法自行復原 - 所以我們開始找環,找到環之後,就復原環上最便宜的那個邊:) - 找到一個環花時間 $O(nm)$ ,我們最多找 $O(nm)$ 次環,因為最差況下我們復原最多 O(nm) 個邊 - 複雜度: $O(n^2m^2)$ ::: :::success ## 子測資三 - 圖+mst - 嘗試著把矩陣 $A$ 變成一個二分圖:如果 $A[i][j]=-1$,那我們就在圖中把兩個點 $x_i, y_j$ 中間連一條邊,邊權是 $B[i][j]$ - 這樣我們得到一個帶權無向圖,有 $O(n+m)$ 個節點,還有 $O(nm)$ 條邊 - 換個方式想,我們嘗試著找出最後要保留哪一些邊給自己復原。當然,這些點的邊權和盡可能大。 - 然後我們發現,因為我們找到的圖不能有環,所以它是一棵樹。想到甚麼呢?就是最大生成樹啦! - 複雜度: $O(nm\times\log(nm))$ ::: :::info # C. 基本傳染數 - 題目連結: https://oj.lscsc.club/contest/1/problem/3 ::: :::success ## 子測資一 - 直接計算 - 用for迴圈分別計算所有 $R_0^i$ ,再用for迴圈把它們加起來 - 複雜度: $O(n^2)$ ::: :::success ## 子測資二 - 普通優化計算 - 用for迴圈與遞迴式 $R_0^i=R_0^{i-1}\times R_0$ 直接計算所有 $R_0^i$ ,再用for迴圈把它們加起來 - 複雜度: $O(n)$ ::: :::success ## 子測資三 - 折半優化計算(快速冪) - 遞迴式如下: - 如果是奇數項,也就是 $N+1$ 是奇數的時候,就剪掉一項變成偶數項: $$\sum_{i=0}^NR_0^i=1+R_0\times\sum_{i=0}^{N-1}R_0^i$$ - 如果是偶數項,也就是 $N+1$ 是偶數的時候,就直接拆半計算: $$\sum_{i=0}^NR_0^i=(R_0^{(N+1)/2}+1)\times\sum_{i=0}^{(N-1)/2}R_0^i$$ - 複雜度: $O(\log{n})$ ::: :::info # D. 電力公司經理的私心 - 題目連結: https://oj.lscsc.club/contest/1/problem/4 ::: :::success ## 子測資一、二 *子測資一二可能差別在一堆小優化ㄅ...不然我也不知道了XD* - 模擬 - 直接開個陣列模擬一下XD - 枚舉$m=\{2,3,4,5,...,N\}$,看看哪個能跑出$f(N,m)=1$ - 複雜度: $O(n^3)$ ::: :::success ## 子測資三 - dp (約瑟夫問題) - 遞迴式 $f(N,m)=(f(N−1,m)+m)\%N$ - 枚舉$m=\{2,3,4,5,...,N\}$,看看哪個能跑出$f(N,m)=1$ - 複雜度: $O(n^2)$ ::: :::info # E. 猴子去買菜 - 題目連結: https://oj.lscsc.club/contest/1/problem/5 - 這題很容易卡在輸入,可以用stringstream更直觀的輸入:) ::: :::success ## 子測資一 - dp (背包問題) - 就是最經典的一維無限背包問題阿,只是做了點變化 - $dp[i][j]$ 表示前i項組合包中買到至少j個份食材最少花錢數 - $dp[i][j] = min\{dp[i-1][j-package[i].a\times x]+package[i].cost\}$ - 記得用往後轉移的方式才不會超時喔! - 複雜度 $O(n\cdot a)$ ::: :::success ## 子測資二 - dp (還是背包問題) - 就是解三次背包問題XD - 複雜度 $O(n\cdot (a+b+c))$ ::: :::success ## 子測資三 - dp (還是背包問題) - 就是三個背包的背包問題XD - dp[i][j][k][l]表示前i項組合包中買到至少j個份a食材,至少k個份b食材,跟至少l個份c食材最少花錢數 - $dp[i][j] = min\{dp[i-1][j-package[i].a\times x][k-package[i].b\times x][l-package[i].c\times x]+package[i].cost\}$ - 複雜度 $O(n\cdot a\cdot b\cdot c))$ :::