UVALive 6852 優化列舉

2021-08-19 03:33:47 字數 1002 閱讀 4692

題目放在這裡,模型就是覆蓋問題,問被0,1...n張被子覆蓋的人數

這道題從re,到tle,再到wa,再到ac,花費了很多力氣,題目關鍵在於a,b是在(1,16)範圍的,因此區間總數最大16*16/2=128,本來想著o(128m)列舉就過了,沒想到最後優化成最簡版本的o(128*m)還是tle,那麼我只好去學習別人的優化演算法。其實,別人的優化演算法也是在這個128個區間的思路去進行的,只有了解這個最初版本,去理解優化版本才有實際意義,首先128版本是利用,利用map[a][b]陣列表示(a,b),他的值為覆蓋數,那麼我把人數從1-m(1<=k<=m)遍歷這128個區間,如果1<=k%b<=a,那麼這個k就是在(a,b)區間被覆蓋的,所以+map[a][b]就是k在map[a][b]區間被覆蓋的次數,最後在把人數統計一下就可以得出答案了

優化版本:我們可以直接把128個區間壓縮成16個陣列,把(a,b)中的b當成陣列的行,那麼map[b][j]就是區間(j,b)的覆蓋數,我們從i=0;i<=a-1;i++  每乙個map[b][i]++,也就是在在右端點固定住的情況下,每張被子的覆蓋情況,那麼我們在最後遍歷m個人的時候,直接k%b就是k所在的區間,這裡需要注意一下,m不能按照128版本從1-m,而是從0-m-1,因為被子都是從0開始的,所以每乙個被子都會覆蓋0這個元素,但是不一定都覆蓋m這個元素,而且需要注意的是,我去處理區間的時候,是0-a-1,因為k=u*a時,k%a==0所以我們就直接轉移到map[j][0]上面去了。

#include #include #include #include #include using namespace std;

int n,m,t;

int num[100009];

int map[20][20];

int main()

for(i=0; i<=m-1; i++)

num[ans]++;

}for(i=0; i<=n; i++)

}}/*

23 30

3 53 6

2 5*/

uvalive4327(單調佇列優化)

這題我有閃過是用單調佇列優化的想法,也想過有左右兩邊各燒一遍。但是不敢確定,搜了題解,發現真的是用單調佇列,然後寫了好久,調了好久下標應該怎麼變化才過的。dp i j 表示走到第i行,第j個豎線的最大價值。dp i j max dp i 1 k pre i j 1 pre i k 1 從左往右 dp...

考題 列舉 旋轉子段 列舉 推導優化

zyl有n張牌編號分別為1,2,n。他把這n張牌打亂排成一排,然後他要做一次旋轉使得旋轉後固定點盡可能多。如果第i個位置的牌的編號為i,我們就稱之為固定點。旋轉可以被認為是將其中的乙個子段旋轉180度,這意味著子段的第一張牌和最後一張牌交換位置,以及第二張牌和倒數第二張牌交換位置,等等。寫乙個程式,...

列舉優化 優美的序列

題目描述 l喜歡序列 明顯吃飽了沒事幹 他最近在研究乙個優美的序列。假設有乙個長度是n的序列,對於區間 l,r 當且僅當存在k l,r 對於任意i l,r 滿足ak ai,也就是區間裡存在乙個數字是該區間所有數的約數。l想知道最長的優美區間是多少。想知道?不告訴你!30 資料 n 30,1 ai 3...