給定乙個長度為n的序列a_i,定義a[i]為第i個元素的價值。現在需要找出序列中最有價值的「段落」。段落的定義是長度在[s,t]之間的連續序列。最有價值段落是指平均值最大的段落,
段落的平均值=段落總價值/段落長度。
輸入格式:
第一行乙個整數n,表示序列長度。
第二行兩個整數s和t,表示段落長度的範圍,在[s,t]之間。
第三行到第n+2行,每行乙個整數表示每個元素的價值指數。
輸出格式:
乙個實數,保留3位小數,表示最優段落的平均值。
輸入樣例#1:
32 23
-12
輸出樣例#1:
1.000
【資料範圍】
對於30%的資料有n<=1000。
對於100%的資料有n<=100000,1<=s<=t<=n,-10000<=價值指數<=10000。
【題目**】
tinylic改編
有一道好題,根本不會。。。qwq
可以看出答案具有單調性,所以考慮二分答案,變為判定性問題。
對於可能的答案k,設b[i]=a[i]-k。
就是求b陣列一段長度在s,t之間的和的最大值,判斷其是否大於等於0,可以用字首和+單調佇列維護。
我並不知道單調佇列怎麼用,於是就吵了std,來日再研究。
#include#includeusing namespace std;
const int n=100005;
int n,s,t,a[n],q[n];
double b[n],sum[n];
bool check(double k)
return false;
}int main()
printf("%.3f\n",l);
return 0;
}
洛谷p1419尋找段落
原題 看到小數,想一下可不可以二分,如果二分怎麼判斷。讓每個值去減mid,找到乙個正值的段落即可,如果沒有l和r的限制,f i max f i 1 0 a i mid即可。但由於l和r,可以使用單調佇列,最小的最優,使你所求的區間最大。include include include include ...
洛谷 P1419 尋找段落
原題 給定乙個長度為n的序列a i,定義a i 為第i個元素的價值。現在需要找出序列中最有價值的 段落 段落的定義是長度在 s,t 之間的連續序列。最有價值段落是指平均值最大的段落,段落的平均值 段落總價值 段落長度。輸入輸出格式 輸入格式 第一行乙個整數n,表示序列長度。第二行兩個整數s和t,表示...
P1419 尋找段落
題目鏈結 思路 首先二分答案,即 二分最大平均值。我們將a全部減去mid,問題轉化為判斷是否存在乙個長度在s t範圍內的區間它的和為正,如果有說明還有更大的平均值。用字首和和單調佇列維護。然後用單調佇列求出sum i min sum i t sum i s 然後判斷是否大於0即可。include i...