洛谷 P1419 尋找段落(單調佇列,二分

2021-10-09 15:06:04 字數 2573 閱讀 9278

p1419 尋找段落

題意:在n個元素中找l<=size<=r的最大連續段落平均值。

思路1:

先求字首和,雙重迴圈暴力找最大平均值。

**如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

int n;

int l,r;

int k[

101000];

int s[

101000];

double maxx=

-1000000000

;int

main()

}printf

("%.3f"

,maxx)

;}

結果:能過三個點,其他測試點全部tle.

wuwuwu~

(看來水不過去了

思路2:

這題真給我搞自閉了!

蒟蒻無奈只能偷看大佬題解,嘗試理解高深莫測的**~ >-<

以下為我的思考:

需求:我們想要找到最優段落的平均值。

遇到的問題:最優段的長度不確定,暴力列舉一定超時。

解決方法:不妨改變思路,找到可能的最大值與最小值,用二分法逐步逼近答案。

二分法:用兩點取中點,如果中點可以作為最優平均值,那麼就更新最小值的值;反之,更新最大值的值。

如何判斷x的值是否可以作為最優平均值(或者說能否在原陣列中找到平均值為x的段落?

用乙個單調佇列(單調遞增)存這個陣列中的最小值,通過修正隊首與隊尾,判斷大小關係來確定。

這裡涉及到一些數學變換:

可以轉化為sum[r]-sum[l-1]>=0

用單調佇列即可判斷。

**如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

ll n,s,t;

ll k[

1001000];

ll s[

1001000];

ll m,l=

100000000

,r=-

100000000

;deque dque;

//單調佇列,存最小的值

intjugle

(ll x)

return0;

}int

main()

while

(lprintf

("%.3f",(

double

)l/10000);

}

輸入輸出樣例

輸入 #1

2 2-1

輸出 #1

1.000

以下為輸出,

10000 30000

10000 19999

10000 14999

10000 12499

10000 11249

10000 10624

10000 10311

10000 10155

10000 10077

10000 10038

10000 10018

10000 10008

10000 10003

10000 10001

10000 10000

1.000

可以看到,l,r的值逐漸接近。

注意:m=(l+r+1)/2;//為了向大的值偏移,否則可能一直卡在最小值出不去

一定要加一,因為當中間值符合條件時我們是改變的最小值,也就是說,如果不加一的話,可能一直卡在最小值出不去。

乘以10000可以簡化**,增加精度。

巧妙利用二分法,解題多一種思路~

最小值和最大值的改動一定要注意!!!

洛谷1419 尋找段落(單調佇列)

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

P1419 尋找段落 單調佇列 二分

題意 給出n個數,讓我們求出乙個最大的平均值 求平均值的區間只能在 s,t 這樣的乙個範圍內選取 假如 3 4 則表明可以選擇乙個區間大小為3或者4的,而不能選擇其他大小 思路 首先二分答案,即 二分最大平均值。我們將a全部減去mid,問題轉化為判斷是否存在乙個長度在s t範圍內的區間它的和為正,如...

洛谷 P1419 尋找段落

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