最近,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
思路
二分枚举任意两基站最小距离,就是用二分法设最小距离从n开始,一个数一个数的的测试,看看满意度是否大于w
dp记录最大满意度进行与W比较即可。
代码
#include<bits/stdc++.h>
using namespace std;
#define MAX1 99999
int a[MAX1],dp[MAX1],flag=0;
int main(){
int n,w;
cin>>n>>w;
for(int i=1;i<=n;i++){
cin>>a[i];
}
if(w==0) cout<<n+1<<endl;
else{
int l=0,r=n,x=0,flag=0;//两个相邻基站最小距离r-l=n
while(l<r){
memset(dp,0,sizeof(dp));
x=(l+r+1)/2;//两个相邻基站最小距离,从中间开始划分
dp[0]=0;
for(int i=1;i<=n;i++){
dp[i]=dp[i-1];//不选择第i个城市建基站
if(i-x>=0&&i+x<=n+1) dp[i]=max(dp[i],dp[i-x]+a[i]);
}
if(dp[n]>=w){//相邻基站最小距离扩大
l=x;
flag=1;
}
else r=x-1; //相邻基站最小距离缩小
}
if(flag&&l) cout<<l<<endl;
else cout<<-1<<endl;//一直缩小
}
return 0;
}