NOI Online 3 提高組 T1水壺 題解

2022-01-10 18:16:31 字數 986 閱讀 8110

有 \(n\) 個容量無窮大的水壺,它們從 \(1\sim n\) 編號,初始時 \(i\) 號水壺中裝有 \(a_i\) 單位的水。

你可以進行不超過 \(k\) 次操作,每次操作需要選擇乙個滿足 \(1≤x≤n−1\) 的編號 \(x\),然後把 \(x\) 號水壺中的水全部倒入 \(x+1\) 號水壺中。

最後你可以任意選擇恰好乙個水壺,並喝掉水壺中所有的水。現在請你求出,你最多能喝到多少單位的水。

第一行乙個正整數 \(n\),表示水壺的個數。

​第二行乙個非負整數 \(k\),表示操作次數上限。

​第三行 \(n\) 個非負整數,相鄰兩個數用空格隔開,表示水壺的初始裝水量 \(a_1、a_2 \cdots an\)。

一行,僅乙個非負整數,表示答案。

輸入 #1

10

5890 965 256 419 296 987 45 676 976 742

輸出 #1

這道題比之前的 \(t1\) 友好多了

首先,倒水的這幾個水壺肯定要相連,否則不會產生最大的價值

那麼我們就可以把問題轉化為在乙個序列中求一段長度固定的區間的和,使這個和最大

這樣的話我們用字首和記錄一下就好了,複雜度為 \(o(n)\)

這道題唯一需要注意的是倒 \(k\) 次水,區間的長度為 \(k+1\)

#includeusing namespace std;

typedef long long ll;

const int maxn=1e6+5;

ll a[maxn],qzh[maxn];

int main()

k++;

ll ans=-1;

for(ll l=1;l<=n;l++)

printf("%lld\n",ans);

return 0;

}

NOI Online 3 提高組 水壺

在乙個長度為 n 的序列中求出長度為 k 1 的最大子段。本題唯一的需要注意的一點是當 k n 時要輸出所有數的和,像我的考場 scanf d d n,k k if k n k n for int i 1 i n i scanf d a i for int i 1 i k i op a i for ...

NOI Online 3 提高組 優秀子串行

點此看題 首先有乙個樸素dpdp dp,因為每個數字都只會最多出現1 11次,而且出現數字相同的不同情況最後也可以一起算答案 和一定 那麼我們只需要統計出方案數,dp i dp i dp i 為二進位制位出現的裝壓為i ii,轉移列舉包含i ii的狀態j jj,設a i a i a i 為值i ii...

NOI Online 3 提高組 魔法值

我是真沒想到可以用 flo yd floyd floy d 好吧其實也不是正宗的吧 感覺這個演算法已經被我遺忘了 qwq qwqqw q。結果考場上把快速冪又打爆了 定義 to i j k to i j k to i j k 為 i ii 到 j jj 的路徑長度為 2 k2 k 2k的方案總數,d...