1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
#include <cmath> #include <cstring> #include <cstdio> #include<algorithm> using namespace std; long long N, M, W; long long h[100010], dis[100010]; bool (long long x) { long long sum = 0, ans = 0; for (int i = 1; i <= N;i++) { sum += dis[i]; if(sum<x) { ans += x - sum; dis[i] += x - sum; if(i+W<=N) dis[i + W] -= x - sum; sum += x - sum; } } return ans <= M; } int main() { cin >> N >> M >> W; long long l = 9999999999999, r = -1; for (int i = 1; i <= N;i++) { cin >> h[i]; dis[i] = h[i] - h[i - 1]; l = min(l, h[i]); r = max(r, h[i]); } r += M; long long ans; while(l<=r) { long long mid = l + r >> 1; if(check(mid)) { l = mid+1; ans=mid; } else r = mid-1; for (int i = 1; i <= N;i++) { dis[i] = h[i] - h[i - 1]; } } cout << ans << endl; }
|
近期评论