計蒜客 公告板

2021-09-17 21:29:56 字數 1296 閱讀 3355

問題描述

蒜廠有乙個 h×w 的矩形公告板,其中 h 是高度,w 是寬度。 

現在有若干張 1×wi 的公告, wi 是寬度,公告只能橫著放,即高度為 1 的邊垂直於水平面,且不能互相有重疊,每張公告都要求盡可能的放在最上面的合法的位置上。 

若可以放置,輸出每塊可放置的位置的行號;若不存在,輸出 −1。行號由上至下分別為 1,2,…,h。 

輸入格式 

第一行三個整數 h,w,n (1≤h,w≤10^9;1≤n≤200,000) 。 

接下來 n 行,每行乙個整數 wi(1≤wi≤109) 。 

輸出格式 

輸出n 行,一行乙個整數。 

樣例輸入

3 5 524

333123456

樣例輸出12

13-1這兩種方法在求解這道題上的效果並沒有很大的區別,都是從s[1]向下找。如果用c++中的cin、cout輸入輸出,最後乙個樣例都會超時(提醒我們:能用scanf和printf就盡量用這兩個)

方法一:直接暴力求解

#includeusing namespace std;

const int n=200010;

int s[4*n];

int h,w,n,wd;

void check()

} printf("-1\n");

}int main()

for(int i=1;i<=n;i++)

return 0;

}

方法二:線段樹

#includeusing namespace std;

const int n=200010;

int s[4*n];

int h,w,n;

int flag=0;

void buildtree(int p,int l,int r)

int mid=(l+r)/2;

buildtree(p*2,l,mid);//建立左子樹

buildtree(p*2+1,mid+1,r);//建立右子樹

s[p] = max(s[p*2],s[p*2+1]) ;//更新父親資訊

return;

}void modify(int p,int l,int r,int ww)

if(s[(p<<1)+1]>=ww&&!flag)

s[p]=max(s[(p<<1)],s[(p<<1)+1]);

return;

}int main()

} return 0;

}

計蒜客習題 公告板

問題 蒜廠有乙個 h w 的矩形公告板,其中 h 是高度,w 是寬度。現在有若干張 1 wi 的公告,wi 是寬度,公告只能橫著放,即高度為 1 的邊垂直於水平面,且不能互相有重疊,每張公告都要求盡可能的放在最上面的合法的位置上。若可以放置,輸出每塊可放置的位置的行號 若不存在,輸出 1。行號由上至...

計蒜客 彈簧板

有乙個小球掉落在一串連續的彈簧板上,小球落到某乙個彈簧板後,會被彈到某乙個地點,直到小球被彈到彈簧板以外的地方。假設有 n n 個連續的彈簧板,每個彈簧板佔乙個單位距離,a i a i 代表代表第 i i 個彈簧板會把小球向前彈 a i a i 個距離。比如位置 1 1 的彈簧能讓小球前進 2 2 ...

彈簧板(加強) 計蒜客

目錄 題目 題解 有乙個小球掉落在一串連續的彈簧板上,小球落到某乙個彈簧板後,會被彈到某乙個地點,直到小球被彈到彈簧板以外的地方。假設有n 個連續的彈簧板,每個彈簧板佔乙個單位距離,a i 代表代表第 i 個彈簧板會把小球向前彈a i 個距離。比如位置 1的彈簧能讓小球前進 2個距離到達位置 3。如...