hihoCoder 優化延遲

2022-09-11 14:27:21 字數 1541 閱讀 4898

小ho編寫了乙個處理資料報的程式。程式的輸入是乙個包含n個資料報的序列。每個資料報根據其重要程度不同,具有不同的"延遲懲罰值"。序列中的第i個資料報的"延遲懲罰值"是pi。如果n個資料報按照的順序被處理,那麼總延遲懲罰

sp=1*pi1+2*pi2+3*pi3+...+n*pin(其中i1, i2, ... in是1, 2, 3, ... n的乙個排列)。

小ho的程式會依次處理每乙個資料報,這時n個資料報的總延遲懲罰值sp為

1*p1+2*p2+3*p3+...+i*pi+...+n*pn

小hi希望可以降低總延遲懲罰值。他的做法是在小ho的程式中增加乙個大小為k的緩衝區。n個資料報在被處理前會依次進入緩衝區。當緩衝區滿的時候會將當前緩衝區內"延遲懲罰值"最大的資料報移出緩衝區並進行處理。直到沒有新的資料報進入緩衝區時,緩衝區內剩餘的資料報會按照"延遲懲罰值"從大到小的順序被依次移出並進行處理。

例如,當資料報的"延遲懲罰值"依次是<5, 3, 1, 2, 4>,緩衝區大小k=2時,資料報被處理的順序是:<5, 3, 2, 4, 1>。這時sp=1*5+2*3+3*2+4*4+5*1=38

現在給定輸入的資料報序列,以及乙個總延遲懲罰閾值q。小hi想知道如果要sp<=q,緩衝區的大小最小是多少?

line 1: n q

line 2: p1 p2 ... pn

對於50%的資料: 1 <= n <= 1000

對於100%的資料: 1 <= n <= 100000, 0 <= pi <= 1000, 1 <= q <= 10^13

輸出最小的正整數k值能滿足sp<=q。如果沒有符合條件的k,輸出-1。

5 38

5 3 1 2 4

2
緩衝區最小是1,最大是n。可以利用二分法搜尋最小的滿足要求的緩衝區大小。二分的過程中需要計算sp值,可以利用優先佇列/最大堆計算。

時間複雜度:

二分:o(log n)

計算sp值:o(n log n)

總複雜度:o(n (log n)^2)

注意所有變數開long long!!!

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

long long n, q;

long long p[100005];

long long get_sp(int size_buf)

int weight = 1;

while (!pq.empty())

return sp;

}int solve()

if (get_sp(start) <= q) return start;

if (get_sp(end) <= q) return end;

return -1;

}int main()

VR延遲優化

vr中的 延遲 特指 motion to photon latency 指的是從使用者運動開始到相應畫面顯示到螢幕上所花的時間.這中間經過了大概這麼幾個步驟 感測器採集運動輸入資料 採集到的資料進行過濾並通過線纜傳輸到主機 遊戲引擎根據獲取的輸入資料更新邏輯和渲染視口 提交到驅動並由驅動傳送到顯示卡...

Mysql優化之延遲關聯

有如下sql select from user where name abc order by age limit 10000,10。這個語句同時使用了order和limit,如果沒有索引的話會很慢。那麼可以加上如下索引 name,age 但是加索引之後可能還是很慢,因為這個索引不是覆蓋索引,查詢欄...

Ruby 延遲計算與優化

ruby 的延遲計算大家已經用得很多了,下面就是乙個範例 def current user current user user.where id session user id first endend def foo current user current user endend但這個範例有乙個...