20190813B組

20190813B組

T1:100(100)

賽時:

看到題目和時間限制,就知道是一道水題。

只要不用n^{^{2}}級別的方法,用nlogn級別的都行

算法:

排序

T2:100(100)

賽時:

數據範圍和字符匹配得知,是一道簡單的kmp算法的題。

只不過在預處理p這個轉移數組時,改變一下。

算法:

kmp

T3:20(0)

賽時:

看到題目是一道線段樹的題,可是多維護了幾個參數後。

調試了許久也沒有調出,於是便放棄,將普通的暴力用線段樹維護一下。

賽後:

又煩躁的調了一波,發現就一個非常小的兒子處理問題。

算法:

線段樹

T4:0(0)

賽時:

看着時間不多,打了個最樸素的暴力。

連一點優化都沒有便交上去了。

賽後:

分兩步處理:

第一步:把問題簡單化,假設沒有k的限制,設求出來的方案總數是x。

第二步:考慮k的限制,由於k<7,可以窮舉n個節目取0個,n個節目取1個,n個節目取2個,n個節目取3個,n個節目取3個,n個節目取4個,n個節目取5個,n個節目取6個,窮舉完這幾種情況就可以知道哪些方案是合法的。而且Combinations(34,0) + Combinations(34,1) + Combinations(34,2) + Combinations(34,3) + Combinations(34,4) + Combinations(34,5) + Combinations(34,6) = 1676116。

也就是這個窮舉不超過1676116次。設第二步的方案總數是y。

 

那麼,最後應該輸出的答案就是x - y。

 

第二步的方案數y可以搜索計算結果,下面重點講講第一步的方案數x如何求。

由於n最大是34,直接搜索會超時。可以把n個節目平均分成兩部分,即第1至第n/2個節目歸爲第1部分,第n/2+1個節目至第n個節目歸爲第2部分。

 

第1部分:顯然最多隻有17個節目,每個節目可以取或者不取,窮舉這17個節目的所有情況,顯然有2^17種取法,對於每一種取法,隊伍A都有一個得分,設爲scoreA, 隊伍B也有一個得分scoreB,隊伍C也有一個得分scoreC。不妨設difAB1 = scoreA - scoreB, difAC1 = scoreA - scoreC,即每一種取法,都可以計算出一對值(difAB1,difAC1),

 

第2部分:顯然最多也只有17個節目。每個節目可以取或者不取,窮舉這17個節目的所有情況,顯然也是有2^17種取法。同理,對於每一種取法,設difAB1 = scoreA - scoreB, difAC1 = scoreA - scoreC,即每一種取法都可以計算出一對值(difAB2,difAC2),

 

顯然,如果一個方案要成立,必須要同時滿足:

difAB1 + difAB2 > 0 (即隊伍A的總得分比隊伍B的總得分高)

difAC1 + difAC2 > 0 (即隊伍A的總得分比隊伍C的總得分高)

 

於是,問題轉化爲,枚舉一對值(difAB1,difAC1),在第2部分裏面查詢有多少對(difAB2,difAC2),使得同時滿足

difAB1 + difAB2 > 0

difAC1 + difAC2 > 0

 

顯然,對於第2部分,可以用樹狀數組或者線段樹之類的數據結構進行保存,以備第1部分的查詢所需。

 

由於分兩步求答案,於是時間複雜度 = x + y = 2^17 * Log(2^17) + 1676116

算法:

分治

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章