日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

《算法竞赛进阶指南》打卡-基本算法-AcWing 102. 最佳牛围栏:浮点数二分、前缀和、双指针

發(fā)布時間:2025/4/5 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《算法竞赛进阶指南》打卡-基本算法-AcWing 102. 最佳牛围栏:浮点数二分、前缀和、双指针 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 題目
  • 題解

題目

農(nóng)夫約翰的農(nóng)場由 N 塊田地組成,每塊地里都有一定數(shù)量的牛,其數(shù)量不會少于 1 頭,也不會超過 2000 頭。

約翰希望用圍欄將一部分連續(xù)的田地圍起來,并使得圍起來的區(qū)域內(nèi)每塊地包含的牛的數(shù)量的平均值達到最大。

圍起區(qū)域內(nèi)至少需要包含 F 塊地,其中 F 會在輸入中給出。

在給定條件下,計算圍起區(qū)域內(nèi)每塊地包含的牛的數(shù)量的平均值可能的最大值是多少。

輸入格式
第一行輸入整數(shù) N 和 F,數(shù)據(jù)間用空格隔開。

接下來 N 行,每行輸入一個整數(shù),第 i+1 行輸入的整數(shù)代表第 i 片區(qū)域內(nèi)包含的牛的數(shù)目。

輸出格式
輸出一個整數(shù),表示平均值的最大值乘以 1000 再 向下取整 之后得到的結(jié)果。

數(shù)據(jù)范圍
1≤N≤100000
1≤F≤N
輸入樣例:

10 6 6 4 2 10 3 8 5 9 4 1

輸出樣例:

6500

題解

來源:最佳牛圍欄

題目分析

選取長度最短為f的子序列,其平均值最大。這里的難度在于長度可以大于f,而不是固定f。

我們的思路是,平均值最大問題(最優(yōu)化問題)轉(zhuǎn)化為一個判定問題:猜想(二分)出來一個平均值mid,判斷是否存在一個長度大于等于f的連續(xù)子序列滿足。

有關(guān)平均值的常用技巧:一個序列的平均值大于mid ?\Longleftrightarrow?把序列中每個元素都減去mid,然后求和,只要和大于0

使用雙指針:i 和 j,其間隔為f。需要記錄i指針前面部分的最小值,每次判斷sum[j]大于等于i前面區(qū)間的最小值:sum[j] ≥ min[sum(0 ~ i)],如果滿足,則二分往后半?yún)^(qū)間移動。

注意,這里就滿足了區(qū)間長度大于等于m:因為i 和 j已經(jīng)間隔m,然后如果取i前面的值,則區(qū)間長度大于m。

在代碼中:minv是最小的前綴和,sum[j]也是前綴和,只要sum[j]減去minv大于零,表示從前綴和是minv的位置到j(luò)這個區(qū)間中的所有值的和大于0,也就是平均值大于mid。

時間復(fù)雜度: O(nlogr)O(nlogr)O(nlogr),其中r為二分的長度,這里是≤ 2000,n為序列的長度。

ac代碼

#include <bits/stdc++.h>using namespace std; const int N = 1e5 + 10; int cows[N]; int n, m; double sum[N];bool check(double avg) {// 每個數(shù)變成它減去平均數(shù),再求前綴和for (int i = 1; i <= n; i ++) sum[i] = sum[i - 1] + cows[i] - avg;double minv = 0;// 雙指針for (int i = 0, j = m; j <= n; j ++, i ++) {minv = min(minv, sum[i]); // [0, i]的最小值if (sum[j] >= minv) return true; // sum[j] >= minv:存在長度≥m,且平均值≥ avg}return false; }int main() {cin >> n >> m;for (int i = 1; i <= n; i ++) cin >> cows[i];double l = 0, r = 2000; // 可取的平均值一定在[0, 2000]之間// 二分平均值while (r - l > 1e-5) {double mid = (l + r) / 2;if (check(mid)) l = mid; // 如果mid滿足啦,就判斷更大的平均值,即l = midelse r = mid;}cout << int(r * 1000) << endl;} 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的《算法竞赛进阶指南》打卡-基本算法-AcWing 102. 最佳牛围栏:浮点数二分、前缀和、双指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。