題目描述:
給定乙個長度為n的序列a_i,定義a[i]為第i個元素的價值。現在需要找出序列中最有價值的「段落」。段落的定義是長度在[s,t]之間的連續序列。最有價值段落是指平均值最大的段落,
段落的平均值=段落總價值/段落長度。
輸入輸出格式:
輸入格式:
第一行乙個整數n,表示序列長度。
第二行兩個整數s和t,表示段落長度的範圍,在[s,t]之間。
第三行到第n+2行,每行乙個整數表示每個元素的價值指數。
輸出格式:
乙個實數,保留3位小數,表示最優段落的平均值。
輸入輸出樣例
輸入樣例#1:
3 2 2
3 -1
2輸出樣例#1:
1.000
說明資料範圍:
對於30%的資料有n<=1000。
對於100%的資料有n<=100000,1<=s<=t<=n,-10000<=價值指數<=10000。
思路:
首先二分答案,即:二分最大平均值。
我們將a全部減去mid,問題轉化為判斷是否存在乙個長度在s~t範圍內的區間它的和為正,如果有說明還有更大的平均值。
用字首和和單調佇列維護。
然後用單調佇列求出sum[i]-min(sum[i-t]~sum[i-s]),然後判斷是否大於0即可。
#include
#include
using namespace std;
const int maxn=100010;
int n,s,t,maxx=-maxn,a[maxn];
double sum[maxn];
bool can(double mid)
return0;}
int main()
double l=0,r=double(maxx),mid,ans;
while(r-l>=1e-4)
else r=mid;
}printf("%0.3lf",ans);
return
0;}
二分答案 單調佇列 尋找段落
二分答案 單調佇列字首和維護 每次二分乙個平均值k,序列中的數全部減去k,如果序列中存在長度在 s,t 中且和超過0的子串行,則證明仍然有更大的平均值,到 mid,r 中找,反之,則到 l,mid 中找 這個操作用單調佇列維護 i s q tail 且 sum i s sum q tail 說明i ...
P1419 尋找段落 單調佇列 二分
題意 給出n個數,讓我們求出乙個最大的平均值 求平均值的區間只能在 s,t 這樣的乙個範圍內選取 假如 3 4 則表明可以選擇乙個區間大小為3或者4的,而不能選擇其他大小 思路 首先二分答案,即 二分最大平均值。我們將a全部減去mid,問題轉化為判斷是否存在乙個長度在s t範圍內的區間它的和為正,如...
P1419 尋找段落 二分答案 單調佇列
好久沒寫題了,拼死拼活才寫了道綠題。題目中要我們求一段數列的平均值,這段數的長度被限定在s t之間。那麼我們可以用二分法列舉答案,之後來尋找區間,如果這些區間之中有乙個區間中的數減去二分出的答案的和要比二分出的答案要大,則說明這個二分答案比我們要求的真正的答案要小,則改變區間重新列舉。如果沒有任何乙...