HBCPC2021省赛——Problem H. 信 号 传 输

题目

最近,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;
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

木灬U6770

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

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

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

打赏作者

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

抵扣说明:

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

余额充值