給定序列 \(a\) , 定義 \(f(a)\) 為序列 \(a\) 的最大非空子段和。
你可以花費 \(1\) 的代價,令 \(a\) 中某個元素 \(a_i\) 減一。
\(g(i)\) 的值為花費了 \(i\) 的代價後最小的 \(f(a')\)。
求\(\sum _ ^k g(i)\)
其中 \(1 \leq n \leq 2 \times 10^,-10^ \leq a_ \leq 10^, 1 \leq k \leq 10^\)
考慮如何求出單個 \(g(k)\) 。
考慮二分答案。
設 \(s\) 為 \(a\) 的字首和陣列,目前列舉的答案為 \(w\) 。接下來就是如何判定。
花費代價可以轉化成 \(s\) 字尾減一,則現在就是判定是否存在一種方案使得 \(\forall i。
考慮從前往後貪心。設 \(lim\) 為後面的數不能超過的閾值。
若 \(lim \leq a_i\),則進行 \(a_i-lim\) 次操作,然後令 \(lim=min(lim,a_i+w)\)。
其實不必顯式計算出 \(lim\) 的值,直接令 \(lim=a_i\) 即可。(因為花費代價的操作為字尾減)
上述貪心不難證明。
我們發現,隨著 \(k\) 的增大,原函式 \(g\) 的減小將越來越難。且使 \(g(i)\) 減少 \(1\) 的代價最多不超過 \(n\)
乙個極端的情況是,若全部的 \(a_i\) 均為同一負數,則減小 \(1\) 的代價即為 \(o(n)\) 的。
因此二分出代價區間即可。
時間複雜度 \(o(n^2logw)\)
這還是太慢了...考慮去除冗餘計算,我們的 \(lim\) 重複計算太多次了。
考慮如何一次計算對於 \(w\) 的代價。操作僅有兩種
\(a(w):=a(w)+\max \left(0, a_-l(w)\right), l(w):=\max \left(a_, l(w)\right); \\ l(w):=\min \left(l(w), w+a_\right)\)
然後大力維護即可
貪心 B BnPC 組隊賽補題
題目 題意給你n個單詞並且他們給出他們的能力,然後讓他們的能力 後面的能力,給你k讓你增加 分析首先先讓他們達到0,在進行貪心,如果他的帶來的價值大於組數帶來的價值,肯定是最優的,否則就用價值最大的 include using namespace std typedef long long ll t...
seg顯示時間 51程式
include define segport p0 sbit bit select p2 0 p2 0控制位選鎖存器,位選鎖存器選定 數碼管 sbit seg select p2 1 p2 1控制段選鎖存器,段選鎖存器選定 數碼管的內容 並顯示內容 unsigned char segdata 16 ...
PIC914SEG設定方法
在點亮液晶顯示的時候需要設定seg腳 設定方法如下 了解當前有多少個seg腳可以使用比如914 手冊裡面就說只有24個可以使用 2 根據腳位圖 引腳框圖 檢視那些io口可以設定為seg腳 3 檢視電路圖檢視那些io口被使用為 4 如果被使用則將被使用的seg位置一 比如 如上圖所示led螢幕seg0...