1. 程式人生 > >【總結】北大2018冬令營題目&總結

【總結】北大2018冬令營題目&總結

6道題,6道與概率計數相關的題,6道都涉及998244353這個魔性數字的題

Day1

T1:

給出一顆n個節點的二叉樹,每個葉節點有一個權值(權值均不相同),每個非葉節點有一個概率P,表示:該點的權值有P的概率為它所有子節點中的最小值,同時有(1-p)的概率為所有子節點的最大值。
現在將根節點所有可能的權值從小到大排序,設分別為V1,V2,V3...Vm
其一一對應的概率為D1,D2,D3...Dm
現在求:

1imiDi2Vimod998244353
資料範圍:
對於40%的資料,n≤5000;
對於另外10%的資料,保證樹的形態隨機生成;
對於100%的資料,n≤100000(或300000?);

分析:

40分演算法:O(n2)暴力合併即可
特殊10分演算法:因為樹的形態隨機,期望深度為log級,所以直接暴力列舉每個葉節點。
100分演算法:把40分的用線段樹啟發式合併即可(有點卡常,很危險)。

T2:

有2*n張卡牌,其中n張為增益牌,卡的權值為W1,W2,W3..Wn,另外n張為戰鬥牌,卡的權值為D1,D2,D3...Dn,保證所有Wi,Di均為整數。從中隨機抽取m張,使用其中的k張,使用規則為:每使用一張增益牌,所有戰鬥牌的權值乘上增益牌的權值,每使用一張戰鬥牌,即造成該牌的權值的傷害。
求所有情況下最大傷害之和mod 998244353。
資料範圍:
多組輸入資料
對於100%的資料,

1<Wi<109,Di<109
對於100%的資料,2n3000

分析:

Day1簽到題,不難得到對於每種情況而言,先把能用的增益卡,按從大到小最多用k-1個,最後用盡量少的戰鬥卡,必然是最優策略。
按照這種策略,我們可以分開求抽到i張增益卡,m-i張戰鬥卡,將兩者所有方案之和相乘,就得到我們需要的答案。
對於求用i張增益卡的所有情況的最大乘積之和,很容易計算,用一個揹包加一個限制條件(不能超過k-1個)即可。
對於求用i張戰鬥卡的所有情況的最大和之和,相對要困難一些,不過對揹包熟悉的同學也會覺得相當容易,我們只要按戰鬥卡的權值從小到大排序,假設當前求

dp[i],列舉到的卡牌為j
若k-m+i<2,則dp[i]=D[j]C(j1,i1)
否則dp[i]=D[j]C(j1,i1)+D[i1]
最後再O(m)列舉分別摸到i張增益卡,j張戰鬥卡的dp值,相乘之和就是答案

T3

本題程式碼量頗大,細節多,考場上無人得分(估計都覺得調第一題卡常更有趣)。
題目大意是一個類似於鬥地主的遊戲。
給出一些固定的手牌,假如你是地主,求在擁有這些牌的情況下,所有一定能打出春天(對方無論什麼手牌,都無法出一張牌)的方案數(mod 998244353),地主總牌數為20張。
具體出牌規則我記不太清,基本與鬥地主想同,但有些出入。

分析:

這道題也沒什麼好說的,首先農民不可能有雙王,也就意味著地主手上必有一王
然後分農民是否擁有炸彈這兩種情況:
若農民有炸彈,那麼地主必須先出一堆比他大的炸彈,最後一次性出完所有手牌。這種情況較少,很容易枚舉出來
若農民無炸彈,也就意味著地主必須擁有從1到k的每張牌至少一張,再加上一王的約束,已經有14張牌確定了。最後6張暴力列舉,加一些剪枝,每種情況check一下即可。

Day2

T1:

我們知道求一個圖的最大獨立集問題是完全NP問題。儘管現在並沒有嚴格的多項式複雜度的演算法,但有很多近似多項式複雜度的演算法。現在有一種演算法是這樣的:
隨機得到一個從1到n的排列,從前向後處理,若當前位置的點可以加入我們目前的假設最大獨立集,就加入它,否則忽略它,處理後一位。
求這樣一種演算法能得到最大獨立集的概率 (mod 998244353)。
資料範圍:
對於100%的資料,n≤20

分析:

Day2簽到題
O(2n)複雜度記憶化搜尋所有情況,每種情況表示:若為1,則該點選入當前假設最大獨立集,若為0,則該點可能未訪問,可能與當前的假設最大獨立集矛盾。
每次列舉一個新加入的點,假設有m個可加入的點,其中能達到當前狀態最大獨立集(即區域性最大獨立集)的方案是加入點a1,a2,...ak,其能達到區域性最大獨立集的概率分別為d1,d2,...dk,當前狀態能達到區域性最大獨立集的概率即為

ds=d2(i1)+sm
最終答案即為d0

T2:

獵人遊戲,每個獵人有一個威脅值