洛谷 P1419 尋找段落

2021-08-28 12:16:25 字數 1182 閱讀 6468

原題:

給定乙個長度為n的序列a_i,定義a[i]為第i個元素的價值。現在需要找出序列中最有價值的「段落」。段落的定義是長度在[s,t]之間的連續序列。最有價值段落是指平均值最大的段落,段落的平均值=段落總價值/段落長度。

輸入輸出格式

輸入格式:

第一行乙個整數n,表示序列長度。

第二行兩個整數s和t,表示段落長度的範圍,在[s,t]之間。

第三行到第n+2行,每行乙個整數表示每個元素的價值指數。

輸出格式:

乙個實數,保留3位小數,表示最優段落的平均值。

輸入輸出樣例

輸入樣例#1:

32 23-1

2輸出樣例#1:

1.000

說明【資料範圍】

對於30%的資料有n<=1000。

對於100%的資料有n<=100000,1<=s<=t<=n,-10000<=價值指數<=10000。

【題目**】

tinylic改編

題意:有乙個長度為n的數列,找出其中長度在s-t內的平均值最大數列,輸出最大平均值。

題解:一看題目,開始想到了移動視窗,結果tle了。

之後想到了二分,但是也wa和tle了幾個點。

二分思想很簡單,這道題主要學習的是這個判斷函式check:

對於區間內的所有值我們可以都先減去初始平均值m,之後再判斷若是在題目要求的範圍內存在區間的和大於0,則證明存在更大的平均值,反之則平均值取大了,沒有乙個區間能夠產生這麼大的平均值。

這裡用到了字首和來記錄區間內的和。

附上ac**:

#include #include using namespace std;

int n,s,t,a[100005],q[100005];//q陣列用來記錄字首和的下標

double sum[100005];//字首和記錄到第i個的減去平均值的和

bool check(double m)

int head=1,tail=0;//head為區間的左端點,tail為區間的右端點。

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

return false;

}int main()

double l=-10005,m,r=10005;

while(l+1e-5cout

}

洛谷 P1419 尋找段落

給定乙個長度為n的序列a i,定義a i 為第i個元素的價值。現在需要找出序列中最有價值的 段落 段落的定義是長度在 s,t 之間的連續序列。最有價值段落是指平均值最大的段落,段落的平均值 段落總價值 段落長度。輸入格式 第一行乙個整數n,表示序列長度。第二行兩個整數s和t,表示段落長度的範圍,在 ...

洛谷p1419尋找段落

原題 看到小數,想一下可不可以二分,如果二分怎麼判斷。讓每個值去減mid,找到乙個正值的段落即可,如果沒有l和r的限制,f i max f i 1 0 a i mid即可。但由於l和r,可以使用單調佇列,最小的最優,使你所求的區間最大。include include include include ...

P1419 尋找段落

題目鏈結 思路 首先二分答案,即 二分最大平均值。我們將a全部減去mid,問題轉化為判斷是否存在乙個長度在s t範圍內的區間它的和為正,如果有說明還有更大的平均值。用字首和和單調佇列維護。然後用單調佇列求出sum i min sum i t sum i s 然後判斷是否大於0即可。include i...