給出包含乙個n
n個整數的陣列a
a。找出一段長度至少為m
m的連續序列,最大化它的平均值。
很明顯這道題的答案滿足單調性。若可以找出一段區間的平均值超過k
k,那麼必然可以找到一段區間的平均值超過k−1
k−1。
那麼可以考慮二分答案。
設二分的答案為ans
ans若
(∑ij
a[i]
)÷(j
−i)≥
ans(
j−i+
1≥m)
(i∑j
a[i
])÷(
j−i)
≥ans
(j−i
+1≥m
)則∑i
ja[i
]≥an
s×(j
−i)i
∑ja
[i]≥
ans×
(j−i
)∑ij
a[i]
−ans
×(j−
i)≥0
i∑j
a[i]
−ans
×(j−
i)≥0
∑ij(
a[i]
−ans
)≥0i
∑j(
a[i]
−ans
)≥0於是可以用字首和su
m[i]
=∑j=
1i(a
[i]−
ans)
sum[
i]=j
=1∑i
(a[
i]−a
ns)然後我們就要最大化sum
[i]−
sum[
j](i
−j+1
≥m)s
um[i
]−su
m[j]
(i−j
+1≥m
)於是可以記錄max
(sum
[k])
(k∈1
∼j−1
)max
(sum
[k])
(k∈1
∼j−1
)。然後列舉i
i,判斷最大化後可否超過0。
時間複雜度o(n
logn
)o(n
logn
)
#include
#include
using
namespace std;
const
int n=
300010
;int n,m;
double l,r,mid,a[n]
,sum[n]
;bool
check
(double ans)
return0;
}int
main()
printf
("%lf"
,l);
return0;
}
P1404 平均數 二分
p1404 平均數 二分 這是乙個很常見的二分題目可能題目正解不是二分是單調佇列,而這題呢 我之前一直被幾組陣列卡到懷疑人生,01數規劃嘛就是讓a i mid,然後加起來如果 0那麼就滿足條件,然後我就想著長度為m的一定是最大的,但是資料教我做人,等下看 就知道了。include include i...
平均數 題解 二分 求逆序對
有一天,小a得到了乙個長度為n的序列。他把這個序列的所有連續子串行都列了出來,並對每乙個子串行都求了其平均值,然後他把這些平均值寫在紙上,並對它們進行排序,最後他報出了第k小的平均值。你要做的就是模仿他的過程。第一行兩個整數n,k,意義如題中所述。第二行n個正整數,即為小a得到的序列。一行乙個實數,...
聯賽模擬測試5 平均數 二分答案 逆序對
之前做過類似的兩道題,一道是區間和的 k 小值,一道是眾數的 k 小值 那兩道統計的東西都有單調性,可以用兩個指標維護,o n 計算 但是平均數沒有單調性,不能用兩個指標去掃 但是這道題的資料範圍是 10 5 時間限制是 2.5s 統計答案時還可以再套乙個 log 如果當前列舉的平均值是 mid 的...