题目
最近,H国正在建设一条信号传输通道,这条通道将会依次经过 n+2 个城市,它们恰好分布在 x- 数轴上。不妨分别编号为城市 0 到城市 n+1,那么城市 i 的坐标恰好为 i。
在这 n+2 个城市中,有且仅有城市 0 和城市 n+1 已有建设好的信号基站,你可以在城市 1∼n 中的若干个(或 0 个)城市中也建立信号基站以提高这条信号传输通道的质量,并收获一定的民众满意度。具体地来说,如果选择在城市 i 建造信号基站,那么可以收获 ai的民众满意度。信号传输通道的优质指数被定义为该传输通道任意两个相邻基站的最小距离。
H国找到了国内顶尖的工程师,也就是你,来设计该条信号传输通道的建造方法,在收获的总民众满意度不少于 W 的前提下,最大化该条信号传输通道的优质指数。
输入格式:第一行包含两个整数,分别表示 n,W(0 ≤ n ≤ 2 × 105, 0 ≤ W ≤ 1 * 1018)
第二行包含 n 个整数,第 i 个整数表示 ai (0 ≤ ai ≤ 10^9)。
输出格式:输出一行仅一个整数,表示建造的信号传输通道最大的优质指数。如果无解,输出-1。
输入:
11 12
1 2 1 2 6 2 1 2 1 2 1
输出:
2
题解:
定位:easy-medium
首先二分答案, 设二分到的值为 x, 之后 dp, 设 dp[i] 表示到第 i 个城市的优质指数的最大值,
则dp[i] = max(dp[i-1],a[i]+dp[i-x]),最后与 W比较即可。
总时间复杂度O(n log n),可以通过本题。
解题思路:
代码实现
#include<iostream>
#include<algorithm>
using namespace std;
int n, W, ans;
int a[200010];
int dp[200010];
int main(){
cin >> n >> W;
for (int i = 0; i < n;i++){
cin >> a[i];
}
int p = 1, q = n - 1, t;
while(p<q){//二分最小距离
t = (q - p) / 2 + p;//t最小距离
dp[0] = a[0];//动态规划找最小距离为t时最大满意度
for (int i = 1; i < n;i++){
if(i-t>=1)
dp[i] = max(dp[i - 1], a[i] + dp[i - t]);
else
dp[i] = max(dp[i - 1], a[i]);
}
//cout << t << " " << dp[n - 1] << endl;
if(dp[n-1]>=W){//
p = t + 1;
}
else{
q = t - 1;
}
}
if(dp[n-1]>W)
cout << p << endl;
else if(p==1)
cout << "-1" << endl;
else
cout << p - 1 << endl;
return 0;
}