by 毒液哥
注意到n, m <= 2000. 而我們的問題是對範圍內所有組合數統計能被k整除的個數,所以我們需要得到範圍內所有的組合數模k的餘數。
要注意j <= i,不要計算多餘的0.
用楊輝三角形遞推求出組合數,再用字首和處理即可。
每次用線性時間找到最大值。
切成兩條。
把其他所有的加上q.
記得輸出。
35分演算法中有兩步操作使用了線性時間,其中操作1可以輕鬆用資料結構(堆,線段樹,平衡樹等)在對數時間內解決。
切成兩條。
將原有的點長度都加q,等價於將所有點的長度加q, 再將新點的長度減q. 於是第i次將新點減q(注意此時堆中的數都是已經減去 (i - 1) * q的, 所以新點進堆時還要多減去 (i - 1) * q. 換言之,堆中的數都是實際值減去 (i - 1) * q,因為我們每回合都將所有數加上q而並沒有直接改變堆中的數)。
記得輸出。
所有點都不會變大,而我們每次都會選最大點,則:每次選的點都不比上次選的點大。
切成兩條由於我們每次都按比例將選的點切開,可以得到兩個單調不減的序列。
如果在一開始將原序列排序,那麼我們每次都只用在這三個佇列的隊首中選擇最大值。
記得輸出。
除了新點以外所有點每回合增大q,則:每次選的點至多比上次選的點大q.
切成兩條由於每次選的點至多比上次選的點大q,那麼每次切成的兩條相比上次切的對應的兩條也至多大q,而上次切下的兩條已經在該回合增大了q。因此我們仍然可以得到兩個單調不減的序列。
像65分演算法一樣處理q.
如果在一開始將原序列排序,那麼我們每次都只用在這三個佇列的隊首中選擇最大值。
記得輸出。
100分做法和60分做法幾乎一毛一樣。
這樣的坑爹資料排列方式我是頭一次見到。
這題我掛了。
如果使用暴力,我們會刪掉一些線段然後進入下一狀態。
乙個狀態是指現在平面內還剩多少個點。
注意到,從當前狀態無論以什麼方式刪點,均不會影響之前狀態到當前狀態的決策。換言之,在之前的狀態時,我們只需考慮:怎樣刪點來到達當前狀態即可,而不用管當前狀態下如何刪點到達下乙個狀態。
上述性質即無後效性。
我們用乙個二進位制數s來表示乙個狀態,若s的第i位為1,則表示第(i + 1)個點還存在於平面內。這種表示狀態的方式叫做狀態壓縮。
狀壓dp即狀態壓縮——動態規劃的簡稱。
同樣對於每個狀態列舉拋物線即可。
平面內有n個點,共2 ^ n個狀態。
每次列舉拋物線還要檢查每個點,需要o(n ^ 3)的時間。
不如我們先列舉拋物線,預處理出每條拋物線經過的點。
我們用二進位制數t來表示乙個點集,若t的第i位為1,則表示第(i + 1)個點能被拋物線經過。用t & s即可得到當前狀態該拋物線經過的點。
平面內有n個點,共2 ^ n個狀態。
每次列舉拋物線還要檢查每個點,需要o(n ^ 3)的時間。
每次都要列舉拋物線經過的兩個點,即拋物線必定會刪去的兩個點。既然我們的最終目標是將當前狀態所有的點都刪去,那麼可以知道:刪掉所有點的最優方案中一定會有一條拋物線經過當前狀態第乙個點(否則就沒法刪掉它了)。
那麼我們只需要列舉經過當前狀態第乙個點的拋物線即可(因為這麼做一定不會做出錯誤的決策)。
平面內有n個點,共2 ^ n個狀態。
每次列舉拋物線還要檢查每個點,需要o(n ^ 3)的時間。
那麼我們只需要列舉經過當前狀態第乙個點的拋物線同時預處理出每條拋物線經過的點即可。
第三題比第二題簡單。
出題人為啥不卡100分演算法呢。
noip中涉及精度問題對初學者很不友好。
Noip2016day2 組合數問題problem
題目描述 組合數表示的是從n個物品中選出m個物品的方案數。舉個例子,從 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 這三種選擇方法。根據組合數的定 義,我們可以給出計算組合數的一般公式 其中n 1 2 n 小蔥想知道如果給定n,m和k,對於所有的0 i n,0 j min i,...
Noip2016day2 組合數問題problem
組合數表示的是從n個物品中選出m個物品的方案數。舉個例子,從 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 這三種選擇方法。根據組合數的定 義,我們可以給出計算組合數的一般公式 其中n 1 2 n 小蔥想知道如果給定n,m和k,對於所有的0 i n,0 j min i,m 有多少...
NOIP2017 提高Day2 2 寶藏 解題報告
參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 n 個深埋在地下的寶藏屋,也給出了這 n 個寶藏屋之間可供開發的 m 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發寶藏屋之間的道路 則相對容...