好久沒寫題了,拼死拼活才寫了道綠題。
題目中要我們求一段數列的平均值,這段數的長度被限定在s-t之間。
那麼我們可以用二分法列舉答案,之後來尋找區間,如果這些區間之中有乙個區間中的數減去二分出的答案的和要比二分出的答案要大,
則說明這個二分答案比我們要求的真正的答案要小,則改變區間重新列舉。
如果沒有任何乙個區間的數減去二分出的答案的和要比二分出的答案要大,則說明這個二分答案比我們要求的真正的答案要大。
之後的問題就是如何列舉區間的問題。
我們利用每個數減去二分出的數放到乙個新的陣列中,再利用字首和來求區間的和。
然後利用單調佇列來儲存最小的乙個字首和即可。
#include#include#include
#include
using
namespace
std;
int n, s, k, a[100005
];double sum[100005],now[100008
];double l = -10000, r = 10000
;bool check(double
x)
return0;
}int
main()
while (r - l > 1e-5
) printf(
"%.3lf
", l);
return0;
}
P1419 尋找段落 單調佇列 二分
題意 給出n個數,讓我們求出乙個最大的平均值 求平均值的區間只能在 s,t 這樣的乙個範圍內選取 假如 3 4 則表明可以選擇乙個區間大小為3或者4的,而不能選擇其他大小 思路 首先二分答案,即 二分最大平均值。我們將a全部減去mid,問題轉化為判斷是否存在乙個長度在s t範圍內的區間它的和為正,如...
洛谷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...