题目描述
最近, H H H 国正在建设一条信号传输通道,这条通道将会依次经过 n + 2 n+2 n+2 个城市,它们恰好分布在 x − x- x− 数轴上。不妨分别编号为城市 0 0 0 到城市 n + 1 n+1 n+1,那么城市 i i i 的坐标恰好为 i i i。
在这 n + 2 n+2 n+2 个城市中,有且仅有城市 0 0 0 和城市 n + 1 n+1 n+1 已有建设好的信号基站,你可以在城市 1 ∼ n 1∼n 1∼n 中的若干个(或 0 0 0 个)城市中也建立信号基站以提高这条信号传输通道的质量,并收获一定的民众满意度。具体地来说,如果选择在城市 i i i 建造信号基站,那么可以收获 a i a _i ai的民众满意度。信号传输通道的优质指数被定义为该传输通道任意两个相邻基站的最小距离。
H H H 国找到了国内顶尖的工程师,也就是你,来设计该条信号传输通道的建造方法,在收获的总民众满意度不少于 W W W 的前提下,最大化该条信号传输通道的优质指数。
输入格式
第一行包含两个整数,分别表示 n , W ( 0 ≤ n ≤ 2 × 1 0 5 , 0 ≤ W ≤ 1 0 18 ) n,W(0≤n≤2×10 ^ 5 ,0≤W≤10 ^{ 18} ) n,W(0≤n≤2×105,0≤W≤1018)。
第二行包含 n n n 个整数,第 i i i 个整数表示 a i ( 0 ≤ a i ≤ 1 0 9 ) a _ i (0≤a _ i ≤10^ 9 ) ai(0≤ai≤109)。
输出格式
输出一行仅一个整数,表示建造的信号传输通道最大的优质指数。如果无解,输出-1
。
输入样例:
11 12
1 2 1 2 6 2 1 2 1 2 1
输出样例:
2
题意
在不低于 W W W 的满意度下,使得两信号站之间距离最大。
即:给你一个数组,选 x x x 个位置之和 ≥ W \geq W ≥W,求相邻两位置的间隔的最大值。
思路
二分答案 + d p dp dp
-
二分答案选择最大间距。
-
d p dp dp 求在不小于间距 k k k 的情况下,数组的最大和值。 d p [ i ] dp[i] dp[i] 表示前 i i i 位间距 ≥ k \geq k ≥k的和的最大值
- 不选第 i i i 位: d p [ i ] = d [ i − 1 ] dp[i] = d[i - 1] dp[i]=d[i−1]
- 选第 i i i 位: d p [ i ] = d p [ i − k ] + a [ i ] dp[i] = dp[i - k] + a[i] dp[i]=dp[i−k]+a[i]
代码
int n, w;
int a[N], f[N];
bool check(int x) {
memset(f, 0, sizeof f);
for (int i = 1; i <= n ;i++) {
f[i] = f[i - 1];
if (i >= x && i <= n - x + 1)
f[i] = max(f[i], f[i - x] + a[i]);
}
return f[n] >= w;
}
void solve() {
cin >> n >> w;
int sum = 0;
for (int i = 1; i <= n; i++) cin >> a[i], sum += a[i];
if (sum < w) { cout << -1 << endl; return ; } // 特判 -1
if (w == 0) { cout << n + 1 << endl; return ; } // 特殊的 w==0
int l = 1, r = n;
while (l < r) {
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
cout << l << endl;
}