【经典线性 DP】数组最小间隔为k的和值最大 | 河北省赛 7-8 H-信号传输

在这里插入图片描述

信号传输

题目描述

最近, 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 1n 中的若干个(或 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(0n2×105,0W1018)

第二行包含 n n n 个整数,第 i i i 个整数表示 a i ​ ( 0 ≤ a i ​ ≤ 1 0 9 ) a _ i ​ (0≤a _ i ​ ≤10^ 9 ) ai(0ai109)

输出格式

输出一行仅一个整数,表示建造的信号传输通道最大的优质指数。如果无解,输出-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[i1]
    • 选第 i i i 位: d p [ i ] = d p [ i − k ] + a [ i ] dp[i] = dp[i - k] + a[i] dp[i]=dp[ik]+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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ღCauchyོꦿ࿐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值